这是我在XML中拥有的内容:
<par level="4">Hi </par>
<par level="4">There!</par>
<par level="12">abcd :</par>
<par level="12">efgh .</par>
<par level="4">azert</par>
<par level="4">yuio</par>
<par level="4">p</par>
<par level="4">)</par>
当我读取 PAR 元素时,我想在同一个 DIV 中连接内容,直到 LEVEL 属性仍然与前一个属性相同。但是如果级别发生变化,我需要创建一个新的 DIV。内容顺序不必更改,因此第一个"级别 4"PAR 不必与第二个合并。 除了我提到的最后一点之外,我看到了类似的问题。
所以这是我在上述示例的 xsl 转换后想要的:(XSLT 1.0)
<div class="level4">
Hi there!
</div>
<div class="level12">
abcd :efgh .
</div>
<div class="level4">
azertyuiop)
</div>
我已经有一个模板xsl:template match="par">里面有很多代码。您有什么建议来实现这一点?
你可以做这样的事情:
XML 输入(修改为格式正确)
<doc>
<par level="4">Hi </par>
<par level="4">There!</par>
<par level="12">abcd :</par>
<par level="12">efgh .</par>
<par level="4">azert</par>
<par level="4">yuio</par>
<par level="4">p</par>
<par level="4">)</par>
</doc>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="par[not(@level = preceding-sibling::par[1]/@level)]">
<div class="level{@level}">
<xsl:value-of select="."/>
<xsl:apply-templates select="(following-sibling::par[1])[@level=@level]" mode="dump"/>
</div>
</xsl:template>
<xsl:template match="par[preceding-sibling::par[1]/@level=@level]"/>
<xsl:template match="par" mode="dump">
<xsl:value-of select="."/>
<xsl:if test="following-sibling::par[1]/@level = @level">
<xsl:apply-templates select="following-sibling::par[1]" mode="dump"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
输出
<doc>
<div class="level4">Hi There!</div>
<div class="level12">abcd :efgh .</div>
<div class="level4">azertyuiop)</div>
</doc>