我是否可以在 XSLT 中设置条件,以便仅查找并替换特定标记名称的第一个标记?
例如,我有一个 XML 文件,其中包含许多内容<title>
标签。我想将这些标签中的第一个替换为<PageTitle>
。其余的应该不管。我将如何在我的转换中做到这一点?我目前拥有的是这样的:
<xsl:template match="title">
<PageTitle>
<xsl:apply-templates />
</PageTitle>
</xsl:template>
找到所有<title>
标签并将其替换为<PageTitle>
。任何帮助将不胜感激!
首先title
文档中的元素是通过以下方式选择的:
(//title)[1]
很多人错误地认为//title[1]
选择第一个title
在文档中,这是一个经常犯的错误。//title[1]
选择每个title
第一个元素title
其父级的子级——这不是这里想要的。
使用它,以下转换产生所需的输出:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"title[count(.|((//title)[1])) = 1]">
<PageTitle>
<xsl:apply-templates />
</PageTitle>
</xsl:template>
</xsl:stylesheet>
当应用于此 XML 文档时:
<t>
<a>
<b>
<title>Page Title</title>
</b>
</a>
<b>
<title/>
</b>
<c>
<title/>
</c>
</t>
产生了想要的结果:
<t>
<a>
<b>
<PageTitle>Page Title</PageTitle>
</b>
</a>
<b>
<title />
</b>
<c>
<title />
</c>
</t>
请注意我们如何在 XPath 1.0 中使用著名的 Kaysian 集合交集方法:
如果有两个节点集$ns1
and $ns2
,以下表达式选择属于两者的每个节点$ns1
and $ns2
:
$ns1[count(.|$ns2) = count($ns2)]
在特定情况下,当两个节点集仅包含一个节点时,其中之一是当前节点,以下表达式的计算结果为true()
当两个节点完全相同时:
count(.|$ns2) = 1
其变体用于覆盖身份规则的模板匹配模式:
title[count(.|((//title)[1])) = 1]
仅匹配第一个title
文档中的元素。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)