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 要素を読み取るとき、LEVEL 属性が以前のものと同じになるまで、同じ DIV 内のコンテンツを連結したいと考えています。しかし、LEVEL が変更された場合は、新しい DIV を作成する必要があります。コンテンツの順序を変更する必要がないため、最初の「レベル 4」の PAR を 2 番目の 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>

XSLT1.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 に答える