如何通过XSL删除一个重复的行?

时间:2013-04-09 11:16:38

标签: xml xslt

我有一个XML文件:

<Picture id="001.png"/>

<Line/>

<Picture id="002.png"/>

<Line/>

<Picture id="003.png"/>

并希望将其更改为:

<Picture id="001.png"/>

<Line/>

<Picture id="002.png"/>

我可以通过以下xsl删除“003.png”,因为我知道它的id,但不知道如何删除它上面的“Line”。

 <xsl:template
     match="//Picture[@id='003.png']">
 </xsl:template>

我可以通过跟随兄弟来实现吗? 非常感谢:))

2 个答案:

答案 0 :(得分:0)

您的输入不是格式良好的XML,因为它没有根元素,但这里有一个选项:

样式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <!--
  Drop unwanted elements: <Picture id="003.png"/> and the <Line/> element
  preceding it
  -->
  <xsl:template
    match="Line[following-sibling::*[1][self::Picture[@id = '003.png']]]
         | Picture[@id = '003.png']"/>
</xsl:stylesheet>

输入

<Elements>
  <Picture id="001.png"/>
  <Line/>
  <Picture id="002.png"/>
  <Line/>
  <Picture id="003.png"/>
</Elements>

输出

<Elements>
  <Picture id="001.png"/>
  <Line/>
  <Picture id="002.png"/>
</Elements>

答案 1 :(得分:0)

是的,您可以通过以下兄弟来完成。从Eero Helenius更改代码如下。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
      <xsl:strip-space elements="*"/>

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

      <!--
      Drop unwanted elements: <Line> with fist following-sibling::Picture id = '003.png
      <Picture id="003.png"/>
      -->
      <xsl:template match="Picture[@id = '003.png']"/>

      <xsl:template match="Line">
          <xsl:if test="not(following-sibling::Picture[1][@id = '003.png'])">
            <xsl:copy>
              <xsl:apply-templates select="node() | @*"/>
            </xsl:copy>
        </xsl:if>
       </xsl:template>
    </xsl:stylesheet>