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>元素,我不会对这些元素做任何事情。

对于这些有一个或两个或多个<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 中的每个a元素,您希望输出有关以下c元素的信息,如果在下一个 a元素出现之前出现的话。

为此,您可以使用xsl:key查找给定元素c元素

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

即通过元素前面的第一个将所有c个元素组合在一起。

然后,您可以首先选择一个元素,其中有这样的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 回答