使用 XSLT 更改 XML 文件中的一个标签名称

2024-03-17

我是否可以在 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(使用前将#替换为@)

使用 XSLT 更改 XML 文件中的一个标签名称 的相关文章

随机推荐