2014-09-05 121 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>