这是我的示例xml示例:
<bloc id = "mybloc">
<ref_ex ref = "data1"/>
<ref_ex ref = "data2"/>
</bloc>
<ex id = "data1">
<name>Hello</name>
.. (something else)
</ex>
<ex id = "data2">
<name>Hello Me !</name>
.. (something else)
</ex>
我想得到这样的HTML代码:
<a href="#data1">Hello</a>
<a href="#data2">Hello Me!</a>
我尝试过这个xsl:
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output method = "html"/>
<xsl:template match = "ref_ex">
<a href = "#{@ref}">
<xsl:template match = "ex" use="@ref">
<xsl:value-of select = "@name"/>
</xsl:template>
</a>
</xsl:template>
</xsl:stylesheet>
但是我收到了这个错误:
element template only allowed as child of stylesheet !
有人有任何想法吗?尊重我的格式。
答案 0 :(得分:1)
从评论部分:您无法在另一个xsl:template
内使用xsl:template
。为什么?因为它有点意义。我建议你阅读有关XSLT的基础知识,以便理解tempate匹配的概念。
如果在ex
元素中引用了ID,则下面的样式表会将a
个元素转换为bloc
个元素。正如@helderarocha所建议的那样,另一个可行的解决方案是使用密钥。
假设输入正确(根元素使其格式良好):
<root>
<bloc id = "mybloc">
<ref_ex ref = "data1"/>
<ref_ex ref = "data2"/>
</bloc>
<ex id = "data1">
<name>Hello</name>
<!--.. (something else)-->
</ex>
<ex id = "data2">
<name>Hello Me !</name>
<!--.. (something else)-->
</ex>
</root>
<强>样式表强>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/root">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="bloc[@id='mybloc']">
<xsl:apply-templates select="//ex[id = current()/ref_ex/@ref]"/>
</xsl:template>
<xsl:template match="ex">
<a href="{@id}">
<xsl:value-of select="."/>
</a>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a href="data1">Hello</a>
<a href="data2">Hello Me !</a>
</root>