0

我有一个这样的 XML 文件:

<section>
  <section>
    <title>this is title 1</title>
    <p> first paragraph after the title for which I need to change the element name </p>
    <p>second paragraph</p>
    <p>second paragraph</p>
  </section>
  <section>
    <p>paragraph</p>
    <title>this is title 1</title>
    <p> first paragraph after the title for which I need to change the element name </p>
    <p>second paragraph</p>
    <p>second paragraph</p>
  </section>
</section>

我需要找出一个 XSL 转换,它将在 title 元素之后更改每个<p>元素的元素名称(title 元素之后的第一个 p 元素)。

这个想法是,在转换之后,输出 xml 应该如下所示:

<section>
  <section>
    <title>this is title 1</title>
    <p_title> first paragraph after the title for which I need to change the element name </p_title>
    <p>second paragraph</p>
    <p>second paragraph</p>
  </section>
  <section>
    <p>paragraph</p>
    <title>this is title 1</title>
    <p_title> first paragraph after the title for which I need to change the element name </p_title>
    <p>second paragraph</p>
    <p>second paragraph</p>
  </section>
</section>

我找不到允许我选择此类元素的模板选择表达式,因为它不允许我使用兄弟轴。

有什么建议么?

4

2 回答 2

1

我不确定你的意思是不允许兄弟轴,因为以下应该有效

<xsl:template match="p[preceding-sibling::*[1][self::title]]">

即匹配第一个前面的兄弟是标题元素的p元素。

或者,如果它可以是任何元素,而不仅仅是p,这应该有效:

<xsl:template match="*[preceding-sibling::*[1][self::title]]">

尝试以下 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="*[preceding-sibling::*[1][self::title]]">
      <xsl:element name="{local-name()}_title">
         <xsl:apply-templates select="@*|node()"/>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>
于 2013-09-26T21:13:54.853 回答
1

不知道你在说什么“它不允许我使用兄弟轴”,但以下工作:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" indent="yes" omit-xml-declaration="yes"/>

  <!-- The identity transform. -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

  <!-- Match p elements where the first preceding sibling is a title element. -->
  <xsl:template match="p[preceding-sibling::*[1][self::title]]">
    <p_title>
      <xsl:apply-templates select="node()|@*"/>
    </p_title>
  </xsl:template>

</xsl:stylesheet>
于 2013-09-26T21:14:04.577 回答