1

XML ファイルに 2 つの名前空間/属性を追加しようとしています。構造は外部定義 (XSD) であり、XSLT を介して 2 つの新しい属性/名前空間を追加できるかどうか、またはこれを外部定義に含める必要があるかどうかを知りたいですか? (もちろん、外部定義を更新するのが最も簡単な方法です。)

私はすでにいくつかの質問を見てきました:
ノードに属性を
追加する xslt を使用して子要素に名前空間を追加する
XSLT 変換がエラーをスローする

しかし、私はこれを機能させる方法についてまだ無知です。私は XSLT に関して処女です - まったく経験がありません。これが XSLT 経由で可能かどうかを知りたいです。

そのまま

<ns2:ProcessCommunication xmlns:ns2="http://URL">
   <ns2:communication>
      <ns2:CommunicationTemplateAbbreviation>INV</ns2:CommunicationTemplateAbbreviation>
      <ns2:CommunicationValues>
         <ns2:CommunicationValue>
            <ns2:FinancialValue>205029</ns2:FinancialValue>
            <ns2:Title>Net</ns2:Title>
         </ns2:CommunicationValue>
      </ns2:CommunicationValues>
      <ns2:CustomFields>
         <ns2:CustomField>
            <ns2:Name>SomeValue</ns2:Name>
            <ns2:Answer>
               <ns2:Value>1</ns2:Value>
            </ns2:Answer>
         </ns2:CustomField>
         <ns2:CustomField>
            <ns2:Name>Transaction Currency</ns2:Name>
            <ns2:Answer>
               <ns2:Value>EUR</ns2:Value>
            </ns2:Answer>
         </ns2:CustomField>
      </ns2:CustomFields>
   </ns2:communication>
</ns2:ProcessCommunication>

することが:

<ns2:ProcessCommunication xmlns:ns2="http://URL">
   <ns2:communication>
      <ns2:CommunicationTemplateAbbreviation>INV</ns2:CommunicationTemplateAbbreviation>
      <ns2:CommunicationValues>
         <ns2:CommunicationValue>
            <ns2:FinancialValue>205029</ns2:FinancialValue>
            <ns2:Title>Net</ns2:Title>
         </ns2:CommunicationValue>
      </ns2:CommunicationValues>
      <ns2:CustomFields>
         <ns2:CustomField>
            <ns2:Name>SomeValue</ns2:Name>
            <ns2:Answer>
               <ns2:Value i:type="a:string" xmlns:a="http://www.w3.org/2001/XMLSchema">1</ns2:Value>
            </ns2:Answer>
         </ns2:CustomField>
         <ns2:CustomField>
            <ns2:Name>Transaction Currency</ns2:Name>
            <ns2:Answer>
               <ns2:Value i:type="a:string" xmlns:a="http://www.w3.org/2001/XMLSchema">EUR</ns2:Value>
            </ns2:Answer>
         </ns2:CustomField>
      </ns2:CustomFields>
   </ns2:communication>
</ns2:ProcessCommunication>

追加があります

i:type="a:string" xmlns:a="http://www.w3.org/2001/XMLSchema"

ノードで、値。

ここまでしか行けず、かなり無駄。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" >
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

<xsl:template match="node()">
<xsl:copy>
        <xsl:attribute name="i:type">a:string</xsl:attribute>
        <xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

私は試して使用<xsl:template match="Answer/Value">していますが、これは機能しません。

4

1 に答える 1

1

XSLT 自体の名前空間宣言が欠落しているだけです。これはうまくいくはずです:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"  xmlns:ns2="http://URL">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

<xsl:template match="ns2:Answer/ns2:Value">
<xsl:copy>
        <xsl:attribute name="i:type">a:string</xsl:attribute>
        <xsl:attribute name="xmlns:a">http://www.w3.org/2001/XMLSchema</xsl:attribute>
        <xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>
于 2013-09-17T01:21:30.933 に答える