2014-09-05 122 views
-1

我有兩個XML文件,我想下面的XML轉換的XSLT我們如何轉換那些在XSLTXML以XSLT轉換

輸入XML:

<Order OrderNo=」1234567890」> 

<OrderLines> 

    <OrderLine PrimeLineNo=」1」 SubLineNo=」1」/> 

    <OrderLine PrimeLineNo=」2」 SubLineNo=」1」/> 

</OrderLines> 
</Order> 

輸出XML:

<Order OrderName=」1234567890」> 

<OrderLines MaxOrderNumbers=」2」> 

    <OrderLine LineNumber=」1」 SubLineNumber=」1」/> 

    <OrderLine LineNumber =」2」 SubLineNumber =」1」/> 

</OrderLines> 

</Order> 

我試過下面的代碼,你可以告訴任何人這種正確的方式將xml轉換爲xslt不是

<xsl:for-each select="Order"> 

    <tr> 

    <td><xsl:value-of select="OrderName"/></td> 

    <td><xsl:value-of select="1234567890"/></td> 

    </tr> 

</xsl:for-each> 

<xsl:for-each select="OrderLines"> 

    <tr> 

    <td><xsl:value-of select="MAxOrderNumbers"/></td> 

    <td><xsl:value-of select="2"/></td> 

    </tr> 
</xsl:for-each> 

<xsl:for-each select="OrderLine/LineNumber"> 

    <tr> 
    <td><xsl:value-of select="LineNumber"/></td> 

    <td><xsl:value-of select="1"/></td> 

    </tr> 

</xsl:for-each> 

<xsl:for-each select="OrderLine/SubLineNumber"> 

    <tr> 

    <td><xsl:value-of select="SubLineNumber"/></td> 

    <td><xsl:value-of select="1"/></td> 

    </tr> 
</xsl:for-each> 

<tr> 

    <td><xsl:value-of select="LineNumber"/></td> 

    <td><xsl:value-of select="2"/></td> 

    </tr> 

</xsl:for-each> 

<xsl:for-each select="OrderLine/SubLineNumber"> <tr> 

    <td><xsl:value-of select="SubLineNumber"/></td> 

    <td><xsl:value-of select="1"/></td> 
    </tr> 
</xsl:for-each> 

+0

嘿任何人我能告訴我們該怎麼辦XSLT轉換 – 2014-09-05 10:35:38

+0

你做完作業了嗎?請張貼您嘗試過的一些代碼。 – 2014-09-05 10:38:42

回答

0

在您只想要改變你的XSLT的一部分的情況下,通常最好與XSLT identity template

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

它自己複製所有節點和屬性,這意味着您只需要爲想要更改的零件編寫模板。

您在這裏改變的屬性,所以一個模板來改變OrderNoOrderName應該是這樣的:

<xsl:template match="@OrderNo"> 
    <xsl:attribute name="OrderName"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
</xsl:template> 

同樣模板,因此將被用於PrimeLineNoSubPrimeNo寫入。

你正在做的是增加一個新的屬性到OrderLines元素唯一的其他東西,所以你將有一個模板到OrderLines元素匹配,並且只需添加一個新的元素,像這樣:

<xsl:template match="OrderLines"> 
    <xsl:copy> 
     <xsl:attribute name="MaxOrderNumbers"> 
      <xsl:value-of select="count(OrderLine)" /> 
     </xsl:attribute> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

在實際上,你可以用Attribute Value Templates來簡化它。這個模板也將工作

<xsl:template match="OrderLines"> 
    <OrderLines MaxOrderNumbers="{count(OrderLine)}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </OrderLines> 
</xsl:template> 

大括號指示要計算的表達式,而不是字面直接輸出。

試試這個XSLT

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

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

    <xsl:template match="OrderLines"> 
     <OrderLines MaxOrderNumbers="{count(OrderLine)}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </OrderLines> 
    </xsl:template> 

    <xsl:template match="@OrderNo"> 
     <xsl:attribute name="OrderName"> 
      <xsl:value-of select="." /> 
     </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="@PrimeLineNo"> 
     <xsl:attribute name="LineNumber"> 
      <xsl:value-of select="." /> 
     </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="@SubLineNo"> 
     <xsl:attribute name="SubLineNumber"> 
      <xsl:value-of select="." /> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet>