XSL从另一个xml子项获取密钥内容

时间:2014-03-06 15:23:05

标签: html xml xslt xslt-1.0

这是我的示例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 !

有人有任何想法吗?尊重我的格式。

1 个答案:

答案 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>