匹配第一次出现的子节点

ati*_*tif 2 xslt xslt-2.0

我有一个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>
Run Code Online (Sandbox Code Playgroud)

我想匹配第一个出现的标题元素并添加一些文本.我只想要第一次出现的标题和标题应该是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>
Run Code Online (Sandbox Code Playgroud)

任何提示如何开始是值得赞赏的.

Ian*_*rts 6

这应该做你想要的:

para[heading][1]/heading[1]
Run Code Online (Sandbox Code Playgroud)

它将匹配第一个包含任意标题的第一个标题元素.

示例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>
Run Code Online (Sandbox Code Playgroud)

您的示例输出:

<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>
Run Code Online (Sandbox Code Playgroud)

如果<para>XML中的其他元素可能只是直接嵌套在那里,<body>那么使用更具体的匹配表达式会更安全,即

/body/para[heading][1]/heading[1]
Run Code Online (Sandbox Code Playgroud)