插入元素并使用xslt添加前缀

时间:2017-06-16 07:56:12

标签: xslt xslt-2.0

我需要在<vat:IRmark Type="generic"/>之后添加或插入另一个元素和属性<DefaultCurrency>。并且,有一个特定的组是我需要添加前缀的<Group>元素。我几乎做到了,但插入元素并没有奏效。这是我的示例测试文件:

INPUT文件:

<Data>
<Record>
    <ID>123-AAA</ID>
    <Date>2017-04-23</Date>
    <Group>
        <Hdr>
            <ID>833-AAA</ID>
            <DefaultCurrency>GBP</DefaultCurrency>
            <Sender>truth</Sender>
        </Hdr>
    </Group>
</Record>

生成的输出:

<Data>
<Record xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vat="http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2" schemaLocation="http://www.govtalk.gov.uk/CM/envelope http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2">
    <ID>123-AAA</ID>
    <Date>2017-04-23</Date>
  <vat:Group>
     <vat:Hdr>
        <vat:ID>833-AAA</vat:ID>
        <vat:DefaultCurrency>GBP</vat:DefaultCurrency>
        <vat:Sender>truth</vat:Sender>
     </vat:Hdr>
  </vat:Group>
</Record>

预期输出

    <Data>
<Record xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vat="http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2" schemaLocation="http://www.govtalk.gov.uk/CM/envelope http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2">
    <ID>123-AAA</ID>
    <Date>2017-04-23</Date>
  <vat:Group>
     <vat:Hdr>
        <vat:ID>833-AAA</vat:ID>
        <vat:DefaultCurrency>GBP</vat:DefaultCurrency>
        <vat:IRmark Type="generic"/>
        <vat:Sender>truth</vat:Sender>
     </vat:Hdr>
  </vat:Group>
</Record>

XSLT代码:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vat="http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()[boolean(normalize-space())]|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="DefaultCurrency">
    <xsl:copy-of select="."/>
        <vat:IRmark>
            <xsl:attribute name="Type">generic</xsl:attribute>
        </vat:IRmark>
</xsl:template>
<xsl:template match="*[ancestor-or-self::Group]">
    <xsl:element name="vat:{local-name()}">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="Record">
    <Record xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vat="http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2" schemaLocation="http://www.govtalk.gov.uk/CM/envelope http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2">
        <xsl:apply-templates/>
    </Record>
</xsl:template>

谢谢。

1 个答案:

答案 0 :(得分:3)

这是因为模板优先级。与*[ancestor-or-self::Group]匹配的模板也会与元素DefaultCurrency匹配。由于模板匹配中的条件,模板具有更高的优先级(0.5,我认为,与模板匹配DefaultCurrency的优先级0相比),因此将使用此模板。

要解决此问题,请为模板指定与DefaultCurrency

匹配的手动优先级
 <xsl:template match="DefaultCurrency" priority="1">

您可以在https://www.w3.org/TR/xslt#conflict

了解模板的冲突解决方案