XML到XSLT转换

时间:2014-09-05 10:27:52

标签: xml xslt

我需要两个xml文件,我想在xslt中转换为xml以下我们如何在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 ya而不是

<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>

1 个答案:

答案 0 :(得分:0)

在您只想转换部分XSLT的情况下,通常最好从XSLT开始identity template

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

它本身会按原样复制所有节点和属性,这意味着您只需要为要更改的部分编写模板。

您在此处更改属性,因此将OrderNo更改为OrderName的模板如下所示:

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

因此,类似的模板将针对PrimeLineNoSubPrimeNo撰写。

您正在做的唯一其他事情是向OrderLines元素添加新属性,因此您将拥有一个与OrderLines元素匹配的模板,并且只需添加一个新元素,如下所示: / p>

<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>