1
<a id='a1' name='a1'/>
<b text='b1'/>
<d test='test0' location='L0' text='c0'/>
<a id='a2' name='a2'/>
<b text='b2'/>
<c test='test1' location='L1' text='c1'/>
<c test='test2' location='L2' text='c2'/>
<a id='a3' name='a3'>
<b text='b3'/>
<c test='test3' location='L3' text='c3'/>
<c test='test4' location='L4' text='c4'/>
<c test='test5' location='L5' text='c5'/>

これらの要素はすべて兄弟<c>です。要素がないものもあります。そのような要素については何もしません。

これらには1つまたは2つ以上の要素があるため、要素ごとに1回だけ<c>表示したいと思います。このようなテンプレートを適用しますが、機能しません。a/@name<a>

<xsl:template match="a">
<xsl:choose>
    <xsl:when test="following-sibling::c[1]">
       <p>
          <u>                                           
             <xsl:value-of select="(preceding-sibling::a[1])/@name"/>
          </u>
       </p>                         
    </xsl:when>
    <xsl:otherwise>
    </xsl:otherwise>
</xsl:choose>

次のような出力が必要です。

a2:

location:L1
test:test1
text:c1

location:L2
test:test2
text:c2

a3:

location:L3
test:test3
text:c3

location:L4
test:test4
text:c4

location:L5
test:test5
text:c5
4

1 に答える 1

0

XSLTと予想される結果を見ると、XMLの要素ごとに、次要素が存在する前に発生する場合は、次のC要素にインフォメーションを出力するように見えます。

このために、xsl:keyを使用して、特定の a要素のc要素を検索できます。

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

つまり、すべてのc要素を、 a要素の前にある最初の要素でグループ化します。

次に、最初にそのようなc要素がある要素を次のように選択できます。

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

次に、このテンプレート内で、次のように出力用のcc要素を選択できます。

<xsl:apply-templates select="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(@id, ':&#13;', '&#13;')" />
      <xsl:apply-templates select="key('lookup', generate-id())" />
   </xsl:template>

   <xsl:template match="c">
      <xsl:apply-templates select="@*" />
      <xsl:value-of select="'&#13;'" />
   </xsl:template>

   <xsl:template match="c/@*">
      <xsl:value-of select="concat(local-name(), ':', ., ':&#13;')" />
   </xsl:template>
</xsl:stylesheet>

次のXMLに適用した場合

<root>
   <a id="a1" name="a1"/>
   <b text="b1"/>
   <d test="test0" location="L0" text="c0"/>
   <a id="a2" name="a2"/>
   <b text="b2"/>
   <c test="test1" location="L1" text="c1"/>
   <c test="test2" location="L2" text="c2"/>
   <a id="a3" name="a3"/>
   <b text="b3"/>
   <c test="test3" location="L3" text="c3"/>
   <c test="test4" location="L4" text="c4"/>
   <c test="test5" location="L5" text="c5"/>
</root>

以下が出力されます

a2:

test:test1:
location:L1:
text:c1:

test:test2:
location:L2:
text:c2:

a3:

test:test3:
location:L3:
text:c3:

test:test4:
location:L4:
text:c4:

test:test5:
location:L5:
text:c5:

XML ドキュメントに表示される順序でc要素の属性を出力していることに注意してください。

于 2012-04-30T09:11:41.573 に答える