随后的XSL转换组元素

时间:2012-08-06 14:44:09

标签: xml xslt-1.0

以下是我在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属性仍然与前一个相同。但如果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”&gt;里面有很多代码。 你有什么建议来实现这个目标?

1 个答案:

答案 0 :(得分:0)

你可以这样做:

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>