XSLT - 如何删除重复和空元素?

时间:2014-07-10 12:25:49

标签: xslt xpath

我有 XML 的以下代码:

<para>
  <break/>
  <break/>
  <break/>
  <break/> Text1<break/>
  <break/> Text2<break/>
  <break/>
  <break/>
  <break/>
  <break/>
</para>

我需要关注:

 <para>
      <br>
      Text1
      <br>
      Text2
      <br>
  </para>

我写了 XSLT 它:

<xsl:template match="/">
        <html><body><xsl:apply-templates /></body></html>
  </xsl:template>
         <xsl:template match="para">
            <p><xsl:apply-templates /></p>
        </xsl:template>
        <xsl:template match="break">
            <xsl:if test="following-sibling::break and .='' ">
                <br><xsl:apply-templates /></br>
            </xsl:if>
        </xsl:template>

但它不起作用。你能帮助我吗?

2 个答案:

答案 0 :(得分:2)

您请求的输出无效(<br>元素未关闭)。假设你想得到类似的东西:

<p>
   <br/> Text1<br/> Text2<br/>
</p>

尝试:

<xsl:strip-space elements="*"/>

...

<xsl:template match="para">
    <p>
        <br/>
        <xsl:apply-templates select="text()" />
    </p>
</xsl:template>

<xsl:template match="para/text()">
    <xsl:copy/>
    <br/>
</xsl:template>

答案 1 :(得分:1)

我找到了解决问题的方法:

     <xsl:template match="para">
       <p>
       <xsl:apply-templates/>
       </p>
     </xsl:template>

    <xsl:template match="break">
       <xsl:if test="normalize-space(following-sibling::node()[1]) != '' or name(following-sibling::node()[2]) != 'break'">
          <br/>
       </xsl:if>
    </xsl:template>