1

这是我在 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"> 里面有很多代码。你有什么建议来实现这一目标?

4

1 回答 1

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>
于 2012-08-07T03:22:16.590 回答