我对XML转换很陌生,所以我希望有人可以帮助我。
这就是:我有一个带有一组子节点的节点。其中一个需要转换为属性,而其他的应该保持原样。 我的样式表(或者更确切地说,我的部分模板)如下所示:
<xsl:template match="headerType">
<headerType>
<!-- <xsl:for-each select="./status">
<xsl:attribute name="{name()}">
<xsl:value-of select="text()"/>
</xsl:attribute>
</xsl:for-each>-->
<xsl:for-each select="headerType/*">
<xsl:choose>
<xsl:when test="name()='status'">
<xsl:attribute name="{name()}">
<xsl:value-of select="text()"/>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<!--<xsl:apply-templates select="@*|node()"/>-->
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</headerType>
</xsl:template>
应该转换自:
<headerType>
<status>request</status>
---more child nodes here---
</headerType>
要:
<headerType status="request">
---the rest of the child nodes form headerType here---
</headerType>
但此刻,它只是完全削减了地位。 我想知道我在这里做错了什么?此外,建议阅读有关XML转换/样式表如何工作的一些阅读。 我也想知道如何控制运行哪个模板,因为我有一些其他模板可以删除某些节点(标签?),这些模块突然停止为headerType及其子节点工作。因此,如果我知道如何控制xsl:templates运行的顺序,那就太好了: - )
答案 0 :(得分:0)
在模板中使用name()
将返回'headerType',即模板应用的节点名称。这就是它无法正常工作的原因。
为什么不直接检索节点,如下所示:
<headerType>
<xsl:attribute name="status">
<xsl:value-of select="status"/>
</xsl:attribute>
<xsl:copy-of select="./*[local-name() != 'status']"/>
</headerType>
将模板应用于<headerType>
我相信您可以使用模板上的'priority'属性来定义订单,但我以前从未使用它(实际上从不需要)。 This tutorial似乎很好地讨论了模板的顺序/优先级。或者只是Google it;)