XSLT将父节点名称添加为子节点中的元素



输入

<root>
<category1>
<node>
<subnode>value</subnode>
</node>
</category1>
<category2>
<node>
<subnode>value</subnode>
</node>
</category2>
</root>

输出

<root>
<node>
<subnode>value</subnode>
</category1>
</node>
<node>
<subnode>value</subnode>
</category2>
</node>
</root>

<root>
<node>
<subnode>value</subnode>
<status>category1</status>
</node>
<node>
<subnode>value</subnode>
<status>category2</status>
</node>
</root>

尝试

<xsl:template match="//node">
<xsl:copy>
<xsl:copy-of select="child::node()" />
<xsl:copy-of select=".." />
<!--
Why isn't something like this possible? 
<xsl:copy-of select="ancestor::local-name()"/> 
-->
</xsl:copy>
</xsl:template>

详细信息

希望以上内容足够清楚:)。


其他详细信息(可选)

对于那些在这个圣诞节感到特别慷慨的人,我邀请你继续阅读:D。

我在学习XSLT时遇到了一些困难,觉得我缺少了一些通用/语法概念,但我也需要进行一些"复杂"的转换。例如:

输入

<root>
<category1>
<node>
<name>category1 node pk</name>
</node>
</category1>
<groups>
<node>
<name>First Group</name>
<members>
<name>category1 node pk</name>
</members>
</node>
<node>
<name>Second Group</name>
<members>
<name>category1 node pk</name>
</members>
</node>
</groups>
</root>

输出

<root>
<node>
<name>category1 node pk</name>
<group>All</group>
<status>category1</status>
</node>
<node>
<name>category1 node pk</name>
<group>First Group</group>
<status>category1</status>
</node>
<node>
<name>category1 node pk</name>
<group>Second Group</group>
<status>category1</status>
</node>
</root>

因此,对于XSLT专家来说,我想知道的是您是如何学习XSLT1.0的?尤其是在处理更复杂的转换时。

有没有你觉得特别有用的书或教程?

最后,你认为一个新人在没有帮助的情况下完成上述转变需要多长时间才能变得足够熟练?

<xsl:copy-of select="ancestor::local-name()"/>的语法为<xsl:value-of select="name(..)"/>。在完整代码中的槽位低于

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/*">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="*"/>
<status><xsl:value-of select="name(..)"/></status>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

并给你输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
<node>
<subnode>value</subnode>
<status>category1</status>
</node>
<node>
<subnode>value</subnode>
<status>category2</status>
</node>
</root>

按要求

这应该有助于您入门。我知道您实际的XML输入比这更复杂,但这会产生您所描述的输出(如果您觉得这是一个慷慨的部分)。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="category1">
<node>
<name>
<xsl:value-of select="node/name"/>
</name>
<group>
<xsl:text>ALL</xsl:text>
</group>
<status>
<xsl:text>category1</xsl:text>
</status>
</node>
</xsl:template>
<xsl:template match="groups">
<xsl:for-each select="node">
<node>
<name>
<xsl:value-of select="members/name"/>
</name>
<group>
<xsl:value-of select="name"/>
</group>
<status>
<xsl:text>category1</xsl:text>
</status>
</node>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

您得到以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<node>
<name>category1 node pk</name>
<group>ALL</group>
<status>category1</status>
</node>
<node>
<name>category1 node pk</name>
<group>First Group</group>
<status>category1</status>
</node>
<node>
<name>category1 node pk</name>
<group>Second Group</group>
<status>category1</status>
</node>
</root>

现在,回答您关于学习XSLT的问题。如果你的意思是关于这个主题的书,如果你不介意技术细节的话,Michael Kay的"XSLT2.0和XPATH程序员参考"是迄今为止最好的资源。例如,请参见此处:http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764569090.html.

相关内容

  • 没有找到相关文章

最新更新