如果我要获得以下XML文档......
<?xml version="1.0"?>
<document>
<title>Foobar</title>
<article>
Phasellus ultrices arcu suscipit velit laoreet eu dignissim
dolor pulvinar. Proin ac libero a diam laoreet iaculis nec eu risus.
<ref url="http://en.wikipedia.org/wiki/FooBar">Foobar</ref> potenti.
Duis placerat laoreet est nec fringilla. Quisque vitae semper erat.
</article>
</document>
...我如何将article
元素翻译成以下内容?
<p>
Phasellus ultrices arcu suscipit velit laoreet eu dignissim
dolor pulvinar. Proin ac libero a diam laoreet iaculis nec eu risus.
<a href="http://en.wikipedia.org/wiki/FooBar">Foobar</a> potenti.
Duis placerat laoreet est nec fringilla. Quisque vitae semper erat.
</p>
具体来说,这是我感兴趣的ref
到a
翻译,因为它嵌入了纯文本块中。
答案 0 :(得分:4)
如果您使用标准的XSTL身份转换,这是一项简单的任务,您只需要一个模板来匹配 ref 元素并输出 a 元素代替。
<xsl:template match="ref">
<a>
<xsl:apply-templates select="@*|node()"/>
</a>
</xsl:template>
要替换该属性,您可以使用另一个模板
<xsl:template match="ref/@url">
<xsl:attribute name="href">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
请注意,如果您的 ref 元素始终具有 url 属性,您还可以将这两个模板简化为一个,如下所示:
<xsl:template match="ref">
<a href="{@url}">
<xsl:apply-templates select="node()"/>
</a>
</xsl:template>
然后,您可以添加其他模板以根据需要替换任何其他元素,例如文章更改为 p ,以及不输出的模板标题元素。
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/document">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="title" />
<xsl:template match="article">
<p>
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="ref">
<a>
<xsl:apply-templates select="@*|node()"/>
</a>
</xsl:template>
<xsl:template match="ref/@url">
<xsl:attribute name="href">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当应用于您的示例XML时,输出以下内容
<p>
Phasellus ultrices arcu suscipit velit laoreet eu dignissim
dolor pulvinar. Proin ac libero a diam laoreet iaculis nec eu risus.
<a href="http://en.wikipedia.org/wiki/FooBar">Foobar</a> potenti.
Duis placerat laoreet est nec fringilla. Quisque vitae semper erat.
</p>
答案 1 :(得分:0)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="document"/>
</xsl:template>
<xsl:template match="document">
<document>
<xsl:apply-templates/>
</document>
</xsl:template>
<xsl:template match="title">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="article">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="ref">
<a>
<xsl:attribute name="href">
<xsl:value-of select="@url"/>
</xsl:attribute>
<xsl:apply-templates/>
</a>
</xsl:template>
</xsl:stylesheet>