をなくすために何を為すべきかをxmlns=""の応募作XSLT変換のXML doc別のXML doc
-
12-09-2019 - |
質問
Ok、数多くの変化がこの質問:あなたの確に答えっと、うんちきれんばかりの密度を適用し、他の回答がどのようにしています。
しているのか教えてくださいXMLに見えるには、次のようなもの:
<?xml version="1.0" encoding="utf-8"?>
<message>
<cmd id="api_info">
<api-version>1.0</api-version>
<api-build>1.0.0.0</api-build>
</cmd>
</message>
現在、XSLT変換をしているところをこの形式をサポートしています。は、XSLTは、例えば次のようなもの:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
version="2.0">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="message"/>
</xsl:template>
<xsl:template match="message">
<xsl:element name="message" xmlns="http://www.companyname.com/schemas/product/Version001">
<xsl:apply-templates select="/message/cmd/@id"/>
</xsl:element>
</xsl:template>
<xsl:template match="/message/cmd/@id">
<xsl:variable name="_commandType" select="/message/cmd/@id"/>
<xsl:element name="messageHeader">
<xsl:element name="cmdType">
<xsl:value-of select="$_commandType"/>
</xsl:element>
</xsl:element>
<xsl:element name="messageBody">
<xsl:choose>
<xsl:when test="$_commandType = 'api_info'">
<xsl:element name="apiInfoBody">
<xsl:element name="apiVersion">
<xsl:value-of select="/message/cmd/api-version"/>
</xsl:element>
<xsl:element name="apiBuild">
<xsl:value-of select="/message/cmd/api-build"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="$_commandType = 'communicationError'">
<xsl:element name="communicationErrorBody">
<xsl:element name="errorCode">
<xsl:value-of select="error-code"/>
</xsl:element>
<xsl:element name="badCmd">
<xsl:value-of select="bad-cmd"/>
</xsl:element>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
出力を取得します基本的にはだいたいとは、以下に示すようになります:
<?xml version="1.0" encoding="UTF-8"?>
<message xmlns="http://www.companyname.com/schemas/product/Version001">
<messageHeader xmlns="">
<cmdType>api_info</cmdType>
</messageHeader>
<messageBody xmlns="">
<apiInfoBody>
<apiVersion>1.0</apiVersion>
<apiBuild>1.0.0.0</apiBuild>
</apiInfoBody>
</messageBody>
</message>
かたくないの xmlns="" 属性には、 <messageHeader> や <messageBody> ます。
今がその場で発音を確認することがいかを明示的に指定する名前空間は、XSLTのための要素にし、不要な属性が押し下げる一つのレベルの子どもたち用されます。
ったにも関わらずっXSLT的かつ明示的に追加の xmlns=""http://www.companyname.com/schemas/product/Version001" 属性ひとりひとりの xsl:要素 定義が知っていることが必要になり、より優雅に。またプログラマーはあまりにものぐさを持っていないショートカットのためこのようなナンセンスです。My XSLTなかったからなど簡単なものが短くなる例にするように誘惑されるかすることができてうれしいです。がないのでなければなります。
なんだろうけど、日本人また僕に足。
おかげさ
AlarmTripper
解決
利用除外結果、プレフィックスのxsl上:スタイルシートのタグ接頭辞「#DEFAULT」
このためW3Cで基準となるこちら
編集:OK、私はもっと慎重にXSLを研究している必要があります。スタイルシートのタグまでのメッセージタグののxmlnsを移動します。これは、同じ名前空間内のすべての結果の要素を入れて、メッセージタグに1つの名前空間属性になります。私は、酸素/ XMLでこれを実行して、必要な出力を得ています。
他のヒント
Ok、きっかけになるかもしれないとです。
は、XSLTいようになります:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="xsl fo xs fn">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="message"/>
</xsl:template>
<xsl:template match="message">
<message namespace="http://www.companyname.com/schemas/product/Version001">
<xsl:apply-templates select="/message/cmd/@id"/>
</message>
</xsl:template>
<xsl:template match="/message/cmd/@id">
<xsl:variable name="_commandType" select="/message/cmd/@id"/>
<xsl:element name="messageHeader">
<xsl:element name="cmdType">
<xsl:value-of select="$_commandType"/>
</xsl:element>
</xsl:element>
<xsl:element name="messageBody">
<xsl:choose>
<xsl:when test="$_commandType = 'api_info'">
<xsl:element name="apiInfoBody">
<xsl:element name="apiVersion">
<xsl:value-of select="/message/cmd/api-version"/>
</xsl:element>
<xsl:element name="apiBuild">
<xsl:value-of select="/message/cmd/api-build"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="$_commandType = 'communicationError'">
<xsl:element name="communicationErrorBody">
<xsl:element name="errorCode">
<xsl:value-of select="error-code"/>
</xsl:element>
<xsl:element name="badCmd">
<xsl:value-of select="bad-cmd"/>
</xsl:element>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
の変更が固定でしたが追加さ 除外-検索結果-接頭辞 属性を <xsl:stylesheet> 要素の変更を行う部門ごとにした:
<xsl:template match="message">
<xsl:element name="message" xmlns="http://www.companyname.com/schemas/product/Version001">
<xsl:apply-templates select="/message/cmd/@id"/>
</xsl:element>
</xsl:template>
するのではなく:
<xsl:template match="message">
<message namespace="http://www.companyname.com/schemas/product/Version001">
<xsl:apply-templates select="/message/cmd/@id"/>
</message>
</xsl:template>
現在に嬉しいです。
があり、多くの方法で、これは電話をかけてきました。将来の提案も歓迎します。
ジム・ギャリソンさん(更新)答えは、あなたが必要としている必要があり、すべてです。しかし、更新されたスタイルシートは、あなたはその結果で出力し、「名前空間」属性を掲示し、私は何をしていいかわからない。
デフォルトの名前空間がどのように機能するかを理解するために重要なことです。属性としてのxmlnsを考えてはいけない、あなたが結果に出力することができます。その代わり、その目的は(上書きされるまで、要素自体とその子孫の一人一)その下のすべてのデフォルトの名前空間を設定することで、あなたのスタイルシートの字句詳細、と考えます。 (言い換えると、それはスタイルシート自体は非常に異なる構造を有する結果XML、同じ機能を有するものである。)
あなたのスタイルシート内のリテラル結果要素(例えば、<メッセージ>)と同様に、<のxsl:element>の指示(例えば、<のxsl:要素名=「メッセージは」>)の両方のデフォルトの名前空間を取る名前はdoesnの供給「Tは、接頭辞を使用しています。あなたがそれらののすべてのは、同じ名前空間に撮りたい場合はジム・ギャリソンが示唆されているように、あなたは、あなたのスタイルシートの一番上にデフォルトの名前空間を配置する必要があります。
そうでなければ、あなたは結果がのxmlns =「」(これらの要素の名前空間を設定解除)を含有していた理由である、その名前空間に含まれていないいくつかの要素になってしまいます。