2012-09-26 96 views
0

我想将元素添加到源xml。用xslt向父元素添加一个元素而不复制

实施例:

<?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无需手动复制所有的元素?

回答

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>