XML以XSLT转换
问题描述:
我有两个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>
答
在您只想要改变你的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
元素匹配,并且只需添加一个新的元素,像这样:
<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>
嘿任何人我能告诉我们该怎么办XSLT转换 – 2014-09-05 10:35:38
你做完作业了吗?请张贴您尝试过的一些代码。 – 2014-09-05 10:38:42