假设我有一个类似以下的XML节点:
<item id="20">
<name>Baz</name>
<description>
If you liked this, you should check out <related id="5">Foo</related>
and <related id="7">Bar</related>!
</description>
<item>
通过XSLT输出描述时,我想要呈现text()
,使每个<related>
节点成为锚标记。我该怎么做呢?
编辑:根据Kirill的请求添加了所需的输出。我希望它看起来像这样:
如果你喜欢这个,你应该看看&lt; a href =“/ items / 5”&gt; Foo&lt; a&gt;和&lt; a href =“/ items / 7”&gt; Bar&lt; a&gt;!
答案 0 :(得分:2)
创建一个模板,覆盖related
元素的默认处理:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="related">
<a href="/items/{@id}"><xsl:value-of select="."/></a>
</xsl:template>
</xsl:stylesheet>
输出:
<item id="20">
<name>Baz</name>
<description>
If you liked this, you should check out <a href="/items/5">Foo</a>
and <a href="/items/7">Bar</a>!
</description>
</item>
这是一个基本的XSLT模式。第一个模板实现了Identity Transform,它通过不变来复制大多数节点。在related
元素的情况下,第二个模板会覆盖第一个模板,将它们转换为HTML锚点。
答案 1 :(得分:1)
有类似的post
这是你案例的一个例子
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="//description" />
</body>
</html>
</xsl:template>
<xsl:template match="//description">
<p>
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="description//text()">
<xsl:copy-of select="." />
</xsl:template>
<xsl:template match="description//related">
<a><xsl:attribute name="href">
/items/<xsl:value-of select="@id" />
</xsl:attribute>
<xsl:apply-templates />
</a>
</xsl:template>
</xsl:stylesheet>
它不干净,你需要继续努力,但这是一个开始