我正在尝试修改以下xsl,以便输出与下面显示的所需输出匹配。我试图按姓氏的名字字母顺序对记录进行排序。但是目前它只是由创作者初始排序我需要它包括编辑器初始,其中记录没有创建者元素。
XML:
<records>
<record>
<creators>
<item>
<name>
<family>Smith</family>
<given>Tim</given>
</name>
</item>
</creators>
</record>
<record>
<creators>
<item>
<name>
<family>Lambert</family>
<given>John</given>
</name>
</item>
</creators>
<editors>
<item>
<name>
<family>testEDITOR</family>
<given>Bob</given>
</name>
</item>
</editors>
</record>
<record>
<editors>
<item>
<name>
<family>ZambertEDITOR</family>
<given>Bob</given>
</name>
</item>
</editors>
</record>
XSL:
<xsl:key name="initial" match="record" use="substring(creators/item/name/family,1,1)"/>
<xsl:template match="/">
<xsl:for-each select="//record[generate-id(.)= generate-id(key('initial', substring(creators/item/name/family,1,1))[1])]">
<xsl:sort select="substring(creators/item/name/family,1,1)"/>
<xsl:for-each select="key('initial', substring(creators/item/name/family,1,1))">
<xsl:if test="position() = 1">
<br /><h3 class="border">
<xsl:value-of select="substring(creators/item/name/family,1,1)"/>
</h3>
</xsl:if>
<p>
<xsl:value-of select="creators/item/name/family"/>
</p>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
期望的输出:
L
Lambert
S
Smith
Z
ZambertEDITOR
答案 0 :(得分:1)
这是一个简单的分组问题:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kWith1stLetter" match="family" use="substring(.,1,1)"/>
<xsl:template match="/*">
<xsl:apply-templates select=
"*/*/*/*/family
[generate-id()
=
generate-id(key('kWith1stLetter',substring(.,1,1))[1])
]">
<xsl:sort select="substring(.,1,1)" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match= "family">
<h3 class="border">
<xsl:value-of select="substring(.,1,1)"/>
</h3>
<xsl:apply-templates mode="inGroup"
select="key('kWith1stLetter',substring(.,1,1))"/>
</xsl:template>
<xsl:template match="family" mode="inGroup">
<p><xsl:value-of select="."/></p>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<records>
<record>
<creators>
<item>
<name>
<family>Smith</family>
<given>Tim</given>
</name>
</item>
</creators>
</record>
<record>
<creators>
<item>
<name>
<family>Lambert</family>
<given>John</given>
</name>
</item>
</creators>
<editors>
<item>
<name>
<family>testEDITOR</family>
<given>Bob</given>
</name>
</item>
</editors>
</record>
<record>
<editors>
<item>
<name>
<family>ZambertEDITOR</family>
<given>Bob</given>
</name>
</item>
</editors>
</record>
</records>
产生了想要的正确结果:
<h3 class="border">L</h3>
<p>Lambert</p>
<h3 class="border">S</h3>
<p>Smith</p>
<h3 class="border">t</h3>
<p>testEDITOR</p>
<h3 class="border">Z</h3>
<p>ZambertEDITOR</p>
,浏览器将其显示为:
大号兰伯特
小号史密斯
ŤtestEDITOR
žZambertEDITOR
<强>解释强>:
正确使用 Muenchian Grouping Method 。
答案 1 :(得分:0)
请参阅链接。 我一直在使用此链接进行开发。
http://zvon.org/comp/m/xslt.html
这个适合初学者的好网站经验丰富
我同意它的GUI界面很差,但是非常善于获取知识
谢谢, 帕