使用姓氏的第一个字母进行XSLT排序
我试图修改以下xsl,以便输出与下面所示的所需输出匹配。我正试图按家族首字母的名字按字母顺序对记录进行排序。然而,目前它只按creators首字母排序,我需要它包含editors首字母,其中记录没有creators元素 XML:使用姓氏的第一个字母进行XSLT排序,xslt,sorting,xslt-1.0,Xslt,Sorting,Xslt 1.0,我试图修改以下xsl,以便输出与下面所示的所需输出匹配。我正试图按家族首字母的名字按字母顺序对记录进行排序。然而,目前它只按creators首字母排序,我需要它包含editors首字母,其中记录没有creators元素 XML: 这是一个简单的分组问题: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration
这是一个简单的分组问题:
<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>
史密斯
提姆
兰伯特
约翰
测试员
上下快速移动
赞伯特编辑
上下快速移动
生成所需的正确结果:
<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>
L
兰伯特
s
史密斯
T
测试员
Z
赞伯特编辑
并在浏览器中显示为:
<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>
L
兰伯特
s
史密斯
T
测试员
Z
赞伯特编辑
说明:
<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>
正确使用这是一个简单的分组问题:
<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>
史密斯
提姆
兰伯特
约翰
测试员
上下快速移动
赞伯特编辑
上下快速移动
生成所需的正确结果:
<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>
L
兰伯特
s
史密斯
T
测试员
Z
赞伯特编辑
并在浏览器中显示为:
<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>
L
兰伯特
s
史密斯
T
测试员
Z
赞伯特编辑
说明:
<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文档不太具有代表性。请编辑问题并添加一条记录
,该记录包含创建者
和编辑器
子项。此外,您还有一个重要的事实,即您希望仅对家族的第一个字母进行排序,请在问题中清楚地解释这一点。谢谢,您已经做了这些更改并更新了问题。@user598241如果您想通知他们,@他们的姓名,否则他们永远不会知道您更改了什么。请阅读此评论框旁边的帮助。@MartinHonnen谢谢,我们已经做了这些更改并更新了问题。如果创建者
和编辑器
的情况对您的问题都很重要,那么我强烈建议向我们展示一个输入示例。请解释当这两个元素都存在时,这两个元素的顺序是否已知。提供的XML文档不太具有代表性。请编辑问题并添加一条记录
,该记录包含创建者
和编辑器
子项。此外,您还有一个重要的事实,即您希望仅对家族的第一个字母进行排序,请在问题中清楚地解释这一点。谢谢,您已经做了这些更改并更新了问题。@user598241如果您想通知他们,@他们的姓名,否则他们永远不会知道您更改了什么。请阅读此评论框旁边的帮助。@MartinHonnen谢谢,我已经做了这些更改并更新了问题。