将命名空间属性添加到XML

时间:2013-09-16 23:45:05

标签: xslt attributes namespaces

我们正在尝试在XML文件中添加两个额外的命名空间/属性。该结构是一个外部定义(XSD),我们想知道是否可以通过XSLT添加两个新的属性/命名空间,或者这应该包含在外部定义中? (当然,更新外部定义是最简单的方法。)

我已经在这里看了几个问题,如:
adding attribute to the node
Adding namespace to child elements using xslt
XSLT transforming is throwing error

但是我仍然对如何使这项工作毫无头绪。我是XSLT的处女 - 根本没有经验。想通过XSLT知道这是否可行。

AS-是

<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">,但这不起作用。

1 个答案:

答案 0 :(得分: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>