使用xslt向父元素添加一个元素而不复制

时间:2012-09-26 07:50:29

标签: xml xslt xpath

我想在源xml中添加一个元素。

实施例: 的来源

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <DataArea>
        <PurchaseOrder>
            <PurchaseOrderLine>
                <DocumentReference type="customersReference1">
                    <DocumentID>
                        <ID>23423</ID>
                    </DocumentID>
                </DocumentReference>
                <Item>
                    <CustomerItemID>
                        <!-- ArtNr -->
                        <ID>444</ID>
                    </CustomerItemID>
                </Item>
                <Quantity unitCode="PCE">17.3</Quantity>
            </PurchaseOrderLine>
        </PurchaseOrder>
    </DataArea>

我想添加元素

<LineNumber>10</LineNumber>

  

DataArea中/ PurchaseOrder的/ PurchaseOrderLine /

因此,第一个解决方案是复制原始xml中的所有数据,然后复制LineNumber

<xsl:copy>
    <xsl:apply-templates select="DocumentReference"/>
    <xsl:apply-templates select="Item"/>
    <xsl:apply-templates select="Quantity"/>
        <!-- ADD HERE LINENUMBER -->
</xsl:copy>

如何在不手动复制所有元素的情况下添加LineNumber

1 个答案:

答案 0 :(得分:2)

这很简单,只需在标准XSLT标识转换中添加一个额外的匹配模板

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

这只是复制元素及其所有子元素,但也添加了新的LineNumber元素。

这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

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

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

应用于XML时,输出以下内容

<DataArea>
   <PurchaseOrder>
      <PurchaseOrderLine>
         <DocumentReference type="customersReference1">
            <DocumentID>
               <ID>23423</ID>
            </DocumentID>
         </DocumentReference>
         <Item>
            <CustomerItemID><!-- ArtNr -->
               <ID>444</ID>
            </CustomerItemID>
         </Item>
         <Quantity unitCode="PCE">17.3</Quantity>
         <LineNumber>10</LineNumber>
      </PurchaseOrderLine>
   </PurchaseOrder>
</DataArea>