【问题标题】:use xsl to change the name of an element which is placed right after another specific element使用 xsl 更改放置在另一个特定元素之后的元素的名称
【发布时间】:2013-10-03 00:41:46
【问题描述】:

我有一个这样的 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 转换,它将在标题元素之后(标题元素之后的第一个 p 元素)更改每个 &lt;p&gt; 元素的元素名称。

这个想法是,转换后的输出 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>

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

有什么建议吗?

【问题讨论】:

    标签: xml xslt transform


    【解决方案1】:

    我不确定你的意思是不允许同级轴,因为以下应该可以工作

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

    即匹配第一个前导元素是 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>
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-29
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多