我需要两个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>
答案 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>
因此,类似的模板将针对PrimeLineNo
和SubPrimeNo
撰写。
您正在做的唯一其他事情是向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>