用空格分组相同的标签

时间:2013-01-15 11:18:52

标签: xslt-1.0

我想知道以下示例的XSLT模式。

输入

<root>
<p>Sample data 1</p>
<data>1</data>
<data>2</data>
<data>3</data>
<data>4</data>
<p>Sample data 2</p>
<p>Sample data 3</p>
<data>a</data>
<data>b</data>
<data>c<i>d</i>e</data>
<data>d</data>
<p>Sample data 4</p>
</root>

必需输出:

<root>
<p>Sample data 1</p>
**<data>1 2 3 4</data>**
<p>Sample data 2</p>
<p>Sample data 3</p>
**<data>a b c<i>d</i>e d</data>**
<p>Sample data 4</p>
</root>

我想将标记"<data>""<data>"内的空格分组,以用于整个XML文件。单个文件中可能会出现许多"<data>"标记。

谢谢, MUTHU

1 个答案:

答案 0 :(得分:0)

此转化

<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:key name="kFollowing" match="data"
          use="generate-id(preceding-sibling::p[1])"/>

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

 <xsl:template match="p">
  <xsl:call-template name="identity"/>
  <xsl:apply-templates mode="group"
       select="key('kFollowing',generate-id())[1]"/>
 </xsl:template>

 <xsl:template match="data" mode="group">
  <data>
    <xsl:apply-templates mode="group"
     select="key('kFollowing',
                 generate-id(preceding-sibling::p[1])
                 )/node()"/>
  </data>
 </xsl:template>

 <xsl:template match="data/node()" mode="group">
   <xsl:if test="not(position() = 1)"><xsl:text> </xsl:text></xsl:if>
   <xsl:apply-templates select="."/>
 </xsl:template>
 <xsl:template match="text()">
   <xsl:value-of select="normalize-space()"/>
 </xsl:template>
 <xsl:template match="/*/*[not(self::p)]"/>
</xsl:stylesheet>

应用于提供的XML文档时:

<root>
    <p>Sample data 1</p>
    <data>1</data>
    <data>2</data>
    <data>3</data>
    <data>4</data>
    <p>Sample data 2</p>
    <p>Sample data 3</p>
    <data>a</data>
    <data>b</data>
    <data>c
        <i>d</i>e
    </data>
    <data>d</data>
    <p>Sample data 4</p>
</root>

会产生想要的正确结果:

<root>
   <p>Sample data 1</p>
   <data>1 2 3 4</data>
   <p>Sample data 2</p>
   <p>Sample data 3</p>
   <data>a b c <i>d</i> e d</data>
   <p>Sample data 4</p>
</root>