3

我有一个 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>

我想匹配第一次出现的标题元素并向其添加一些文本。我只想第一次出现标题,标题应该是 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>
4

2 回答 2

6

这应该做你想要的:

para[heading][1]/heading[1]

它将匹配第一个包含任何标题的段落中的第一个标题元素。

示例 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]
于 2013-03-28T16:37:28.523 回答
0

您需要使用position()of ,para因为您的第<heading>一个是<para>. 并且 para 在它有一个孩子之前出现一次,<heading>所以你需要第二个<para>

应用此 XSLT:

<?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>

到您的源 XML,您将获得以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<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>

PS:我刚刚注意到您想要 XSLT 2.0 - 我的解决方案是 XSLT 1.0。我不确定是否有区别。

于 2013-03-28T16:27:02.430 回答