<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'/>
这些元素都是siblings.some没有<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
答案 0 :(得分:0)
通过查看您的XSLT和预期结果,对于XML中的每个 a 元素,您希望在以下 c 元素上输出信息,如果在下一个 a 元素出现之前发生任何事件。
为此,您可以使用 xsl:key 查找给定 a 元素的 c 元素
<xsl:key name="lookup" match="c" use="generate-id(preceding-sibling::a[1])" />
即。通过前面的第一个 a 元素将所有 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, ': ', ' ')" />
<xsl:apply-templates select="key('lookup', generate-id())" />
</xsl:template>
<xsl:template match="c">
<xsl:apply-templates select="@*" />
<xsl:value-of select="' '" />
</xsl:template>
<xsl:template match="c/@*">
<xsl:value-of select="concat(local-name(), ':', ., ': ')" />
</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 元素的属性。