1

サンプルがあります」:

<Root>
    <A rename="yes,it is option 1"/>
    <C rename="no"/>
    <A rename="yes,it is option 2"/>
    <C rename="no"/>
    <C rename="yes"/>
    <C rename="no"/>  
    <A rename="yes,it is option 3"/>
    <A rename="yes,it is option 4"/>
    <C rename="no"/>
    <C rename="yes"/>
    <C rename="no"/>      
    <C rename="no"/>        
</Root>

次に、次のようなテンプレートを適用します。

   <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:template match="A">
            <p><b>option1: <xsl:value-of select="count(following-sibling::C[preceding-sibling::A[1]/@rename[contains(.,'option 1')]])"/></b></p>
            <p><b>option2: <xsl:value-of select="count(following-sibling::C[preceding-sibling::A[1]/@rename[contains(.,'option 2')]])"/></b></p>            
            <p><b>option3: <xsl:value-of select="count(following-sibling::C[preceding-sibling::A[1]/@rename[contains(.,'option 3')]])"/></b></p>
            <p><b>option4: <xsl:value-of select="count(following-sibling::C[preceding-sibling::A[1]/@rename[contains(.,'option 4')]])"/></b></p>                        
 </xsl:template>
</xsl:stylesheet>

しかし、出力を次のようにしたいと思います。Aに続く兄弟がない場合は、これを無視します。これらの@renameに「オプション」が含まれ、要素も含まれていることを出力します。

option1: 1 

option2: 3 

option4: 4 

私が今得ているのは:

option1: 1 

option2: 3 

option3: 0 

option4: 4 

option1: 0 

option2: 3 

option3: 0 

option4: 4 

option1: 0 

option2: 0 

option3: 0 

option4: 4 

option1: 0 

option2: 0 

option3: 0 

option4: 4 
4

2 に答える 2

1

最新のA要素に続くすべてのC要素をカウントしています。これは、キーを使用して実行でき、そのようなすべてのC要素を関連するA要素とグループ化します。

<xsl:key name="lookup" match="C" use="generate-id(preceding-sibling::A[1])" />

次のCが少なくとも1つ存在するA要素を見つけるには、次のようにします。

<xsl:apply-templates select="A[key('lookup', generate-id())]" />

次に、オプションの数を数えるために、次のように、キーの要素の数を数えることができます。

<xsl:value-of select="count(key('lookup', generate-id()))" />

次のXSLTを試してください

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="yes"/>
    <xsl:key name="lookup" match="C" use="generate-id(preceding-sibling::A[1])" />

    <xsl:template match="/Root">
        <xsl:apply-templates select="A[key('lookup', generate-id())]" />
    </xsl:template>

    <xsl:template match="A">
        <xsl:value-of select="concat(@rename, ': ', count(key('lookup', generate-id())) , '&#13;&#13;')" />
    </xsl:template>
</xsl:stylesheet> 

これをXMLサンプルに適用すると、次のように出力されます。

yes,it is option 1: 1

yes,it is option 2: 3

yes,it is option 4: 4

concat('option', substring-after(@rename, 'option '))'yesの代わりに'option1'を実行したい場合は、オプション1'であることに注意してください。@rename

XMLを再構築した場合、この問題は単純化される可能性があることに注意してください。このようなものははるかに良いでしょう:

<Root>
    <A rename="yes,it is option 1">
        <C rename="no"/>
    </A>
    <A rename="yes,it is option 2">
        <C rename="no"/>
        <C rename="yes"/>
        <C rename="no"/>
    </A>
    <A rename="yes,it is option 3"/>
    <A rename="yes,it is option 4">
        <C rename="no"/>
        <C rename="yes"/>
        <C rename="no"/>
        <C rename="no"/>
    </A>
</Root>
于 2012-05-01T07:50:11.797 に答える
0

XSLT 2.0では、これはxsl:for-each-group命令を使用して簡単にグループ化する問題になります。

<xsl:template match="Root">
  <xsl:for-each-group group-starting-with="A" select="*">
    <xsl:if test="count(current-group()) != 1">
      <p>Option <xsl:value-of select="substring-after(current-group()[1]/@rename, 'option ')"/> = <xsl:value-of select="count(current-group())-1"/></p>        </xsl:if>
  </xsl:for-each-group>
</xsl:template>
于 2012-05-01T08:05:53.413 に答える