XSLT连接文本

时间:2016-06-11 17:43:01

标签: xslt

我有大量的html文件,如下所示:

<html>
  <head>
    <title>t</title>
  </head>
  <body>
    <div class="a">
      <div class="b" type="t1">
        b11<div class="x">x</div>
        b12<div class="y">y</div>b13
      </div>
      <div class="c">c</div>
    </div>
    <div class="b" type="t2" region="r">b21
      <div class="x">x</div>b22
      <div class="y">y</div>
      b23
    </div>
  </body>
</html>

目前,div class =“b”的文本在节点的开头,中间和末尾被分段。 我想合并div class =“b”的文本,以便它出现在开头。 我想要获取的文件如下:

<html>
  <head>
    <title>t</title>
  </head>
  <body>
    <div class="a">
      <div class="b" type="t1">b11 b12 b13
        <div class="x">x</div>
        <div class="y">y</div>
      </div>
      <div class="c">c</div>
    </div>
    <div class="b" type="t2" region="r">b21 b22 b23
      <div class="x">x</div>
      <div class="y">y</div>
    </div>
  </body>
</html>

我运行以下bash脚本a.sh:

xsltproc a.xslt a.html > b.html

其中a.xslt如下:

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

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

 <xsl:template match="//div[@class='b']">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
   <xsl:for-each select="text()">
    <xsl:if test="position() &gt; 1"><xsl:text> </xsl:text></xsl:if>
    <xsl:value-of select="normalize-space(.)"/>
   </xsl:for-each>
 </xsl:template>

</xsl:stylesheet>

不幸的是我的输出不是我想要的:

<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
    <title>t</title>
  </head>
  <body>
    <div class="a">
      <div class="b" type="t1">b11
        <div class="x">x</div>
        b12
        <div class="y">y</div>
        b13</div>
      b11 b12 b13
      <div class="c">c</div>
    </div>
    <div class="b" region="r" type="t2">b21
      <div class="x">x</div>
      b22
      <div class="y">y</div>
      b23</div>
    <p>b21 b22 b23</p>
  </body>
</html>

关于如何继续,您有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这对你有用吗?

<xsl:template match="div[@class='b']">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:for-each select="text()">
            <xsl:if test="position() &gt; 1">
                <xsl:text> </xsl:text>
            </xsl:if>
            <xsl:value-of select="normalize-space(.)"/>
        </xsl:for-each>
        <xsl:apply-templates select="*"/>
    </xsl:copy>
</xsl:template>