2013-01-07 60 views
0

我不得不一個屬性出版商=「企鵝」從節點列表添加到節點添加屬性到一個DOM節點列表節點:輸入XML看起來像:使用XSLT

<Rack RackNo="1"> 
    <Rows> 
    <Row RowNo="1" NoOfBooks="10"/> 
    <Row RowNo="2" NoOfBooks="15"/> 
    <Rows> 
    </Rack> 

輸出XML lookslike:

<Rack RackNo="1"> 
    <Rows> 
    <Row RowNo="1" NoOfBooks="10" Publisher="Penguin"/> 
    <Row RowNo="2" NoOfBooks="15" Publisher="Penguin"/> 
    <Rows> 
    </Rack> 

我寫的XSL是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="/"> 
     <Order> 
      <xsl:copy-of select = "Rack/@*"/> 
       <xsl:for-each select="Rows/Row"> 
        <OrderLine> 
         <xsl:copy-of select = "Row/@*"/> 
     <xsl:attribute name="Publisher"></xsl:attribute> 
         <xsl:copy-of select = "Row/*"/> 
        </OrderLine> 
       </xsl:for-each> 
      <xsl:copy-of select = "Rack/*"/> 
     </Order> 
</xsl:template> 
</xsl:stylesheet> 

這並不返回所需的輸出。 任何幫助將不勝感激。

在此先感謝你們。

回答

0

這是XSLT標識轉換的工作。就其本身而言它可以方便地在輸入XML創建的所有節點的副本

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

所有你需要做的就是添加一個額外的模板來匹配元素和發行屬性添加到它。這可能是很好的第一參數化要添加

<xsl:param name="publisher" select="'Penguin'" /> 

然後創建匹配的模板如下出版商:

<xsl:template match="Row"> 
    <OrderLine Publisher="{$publisher}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </OrderLine> 
</xsl:template> 

的使用注意事項「屬性值模板」來創建發佈屬性。大括號表示它是一個要評估的表達式。另外請注意,在您的XSLT中,它看起來像是在重命名這些元素,所以我在XSLT中也這樣做了。 (如果不是這種情況下,只需更換訂單行回來

以下是完整的XSLT

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

    <xsl:template match="Rack"> 
     <Order> 
     <xsl:apply-templates /> 
     </Order> 
    </xsl:template> 

    <xsl:template match="Rows"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Row"> 
     <OrderLine Publisher="{$publisher}"> 
     <xsl:apply-templates select="@*|node()"/> 
     </OrderLine> 
    </xsl:template> 

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

當適用於您的XML,下面是輸出

<Order> 
    <OrderLine Publisher="Penguin" RowNo="1" NoOfBooks="10"></OrderLine> 
    <OrderLine Publisher="Penguin" RowNo="2" NoOfBooks="15"></OrderLine> 
</Order>