我想知道以下示例的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
答案 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>