我有一个xml文档
<body>
<heading>Main Heading</heading>
<para>
<text>para 1</text>
</para>
<para>
<heading>heading 2</heading>
<text> para 2</text>
</para>
<para>
<heading>heading 3</heading>
<text>para 3</text>
</para>
</body>
我希望匹配第一个出现的heading元素并为其添加一些文本。我只想要第一次出现的标题和标题应该是para元素的子节点。
所以输出应该如下所示
<body>
<heading>Main Heading</heading>
<para>
<text>para 1</text>
</para>
<para>
<heading>**This is a first heading found** heading 2</heading>
<text> para 2</text>
</para>
<para>
<heading>heading 3</heading>
<text>para 3</text>
</para>
</body>
任何提示如何开始都表示赞赏。
答案 0 :(得分:5)
这应该做你想要的:
para[heading][1]/heading[1]
它将匹配第一个para-that-any-any-headings中的第一个标题元素。
示例XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<xsl:template match="para[heading][1]/heading[1]">
<xsl:copy>**First heading** <xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
</xsl:stylesheet>
示例输出:
<body>
<heading>Main Heading</heading>
<para>
<text>para 1</text>
</para>
<para>
<heading>**First heading** heading 2</heading>
<text> para 2</text>
</para>
<para>
<heading>heading 3</heading>
<text>para 3</text>
</para>
</body>
如果XML中的其他元素可能只有<para>
元素而不是直接嵌套在<body>
下,那么使用更具体的匹配表达式会更安全,即
/body/para[heading][1]/heading[1]
答案 1 :(得分:0)
您需要使用position()
的{{1}},因为您的第一个para
是<heading>
的孩子。而para在它有一个名为<para>
的孩子之前就会发生一次,所以你需要第二个<heading>
。
应用此XSLT:
<para>
到您的源XML,您将获得此输出:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//para[position()=2]/heading">
<xsl:element name="heading">
<xsl:value-of select="concat('**This is a first heading found**',' ',.)"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
祝你好运, 彼得
PS:我刚注意到你想要XSLT 2.0 - 我的解决方案是XSLT 1.0。我不确定是否存在差异。