模板匹配和节点属性

时间:2018-06-22 11:44:41

标签: xml xslt-2.0

客户提供了一个合并的XML,需要将其转换为所需的格式,这可以通过以下XSLT完成。

唯一的问题是发票实体“编号”,如何获得正确的发票编号作为XML中的节点?

XML:

<invoices>
  <invoice number="5555">
    <order_id>
        <ordernumber>1000</ordernumber>
    </order_id>
    <general_info>General A</general_info>
    <address>Adress A</address>
    <products>
        <product>
            <id>A</id>
            <item/>
            <item/>
        </product>
        <product>
            <id>B</id>
            <item/>
            <item/>
        </product>
        <product>
            <id>C</id>
            <item/>
            <item/>
        </product>
    </products>
</invoice>
<invoice number="7777">
    <order_id>
        <ordernumber>2000</ordernumber>
    </order_id>
    <general_info>General B</general_info>
    <address>Adress B</address>
    <products>
        <product>
            <id>D</id>
            <item/>
            <item/>
        </product>
    </products>
</invoice>

XSLT:

    <xsl:template match="invoices">
     <xsl:copy>
        <xsl:apply-templates select="invoice/products/product"/>
     </xsl:copy>
     </xsl:template>

    <xsl:template match="product">
     <invoice>
        <xsl:copy>
            <xsl:copy-of select="*"/>
        </xsl:copy>
          <xsl:copy-of select="../../general_info"/>
          <xsl:copy-of select="../../address"/>
        <invoicenumber><xsl:value-of select="../../../invoice/@number"/></invoicenumber>
    </invoice>
</xsl:template>

对于当前的XSLT,发票号始终为5555。 如何获得每种产品的正确发票编号? (项目D应该有7777)

当前输出:

<invoices>
 <invoice>
  <product>
     <id>A</id>
     <item/>
     <item/>
  </product>
  <general_info>General A</general_info>
  <address>Adress A</address>
  <invoicenumber>5555</invoicenumber>
</invoice>
<invoice>
  <product>
     <id>B</id>
     <item/>
     <item/>
  </product>
  <general_info>General A</general_info>
  <address>Adress A</address>
  <invoicenumber>5555</invoicenumber>
</invoice>
<invoice>
  <product>
     <id>C</id>
     <item/>
     <item/>
  </product>
  <general_info>General A</general_info>
  <address>Adress A</address>
  <invoicenumber>5555</invoicenumber>
</invoice>
<invoice>
  <product>
     <id>D</id>
     <item/>
     <item/>
  </product>
  <general_info>General B</general_info>
  <address>Adress B</address>
  <invoicenumber>5555</invoicenumber>
 </invoice>
</invoices>

所需的输出:

<invoices>
 <invoice>
  <product>
     <id>A</id>
     <item/>
     <item/>
  </product>
  <general_info>General A</general_info>
  <address>Adress A</address>
  <invoicenumber>5555</invoicenumber>
</invoice>
<invoice>
  <product>
     <id>B</id>
     <item/>
     <item/>
  </product>
  <general_info>General A</general_info>
  <address>Adress A</address>
  <invoicenumber>5555</invoicenumber>
</invoice>
<invoice>
  <product>
     <id>C</id>
     <item/>
     <item/>
  </product>
  <general_info>General A</general_info>
  <address>Adress A</address>
  <invoicenumber>5555</invoicenumber>
</invoice>
<invoice>
  <product>
     <id>D</id>
     <item/>
     <item/>
  </product>
  <general_info>General B</general_info>
  <address>Adress B</address>
  <invoicenumber>7777</invoicenumber>
 </invoice>
</invoices>

1 个答案:

答案 0 :(得分:1)

例如,使用导航到祖先invoice<invoicenumber><xsl:value-of select="ancestor::invoice/@number"/></invoicenumber>