在文本中转换XML标记

时间:2012-01-23 20:27:01

标签: xml xslt

假设我有一个类似以下的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;!

2 个答案:

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

它不干净,你需要继续努力,但这是一个开始