此问题从查询XSLT: Sorting based on sum of values from other nodes
开始我有这片xslt(感谢Demitre)我已修改为接收参数'Gait',其值可以是'P'(Pace),'T'(Trot)或'A'(全部) :
<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="kOffspring" match="Horse" use="SireID"/>
<xsl:param name="Gait"/>
<xsl:template match="/*">
<xsl:apply-templates select="Sires/Sire">
<xsl:sort select="sum(key('kOffspring', ID)/*/Stakes)"
data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Sire">
Sire <xsl:value-of select="concat(ID,' (', Name, ') Stakes: ')"/>
<xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
上面的代码就是这篇文章
sum(key('kOffspring', ID)/*/Stakes
有没有办法用xml树中的节点名称替换星号部分,具体取决于传给步态的值是什么?
超级简化的xml是:
<t>
<Horses>
<Horse>
<ID>5</ID>
<Name>hrsE</Name>
<SireID>101</SireID>
<Pace>
<Stakes>100</Stakes>
</Pace>
<Trot>
<Stakes>300</Stakes>
</Trot>
</Horse>
</Horses>
<Sires>
<Sire>
<ID>101</ID>
<Name>srA</Name>
<LiveFoalsALL>117</LiveFoalsALL>
</Sire>
</Sires>
</t>
当Gait为'A'时我想要 sum(键('kOffspring',ID)/ * / Stakes (查看Horse的所有子节点)
当$ Gait为'P'时我想要 sum(键('kOffspring',ID)/ Pace / Stakes (在Pace节点中查找只有Stakes)
当$ Gait为'T'时我想要 sum(键('kOffspring',ID)/ Trot / Stakes (在Trot节点中查找只有Stakes)
所以这是超简化的例子。我试图不再需要复制数百行代码来满足$ Gait的不同值。我尝试使用变量,但在路径中使用键时无法看到如何更改节点路径的值。我看到我可能在'match =“/ *”'模板中使用了一个select语句,但这仅用于排序,当我进入'Sire'模板时我仍然被卡住 - 不想放'选择'围绕'我所拥有的众多'选择'价值。
感谢您的任何建议。 问候, 布莱斯斯滕贝格。
答案 0 :(得分:2)
只需使用
sum(key('kOffspring', ID)/*[name()=$Gait]/Stakes
答案 1 :(得分:1)
<xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)" />
有没有办法用星号部分替换星号部分 在xml树中,取决于传递步态的值是什么?
是的......一种方法是在XPath表达式中包含“switch语句”:
sum(key('kOffspring', ID)/*[
$Gait = 'A' or
(local-name() = (if ($Gait = 'P') then 'Pace' else
if ($Gait = 'T') then 'Trot'))
]/Stakes)
或者,您可以编写<xsl:value-of>
的三个不同版本,每个版本对应$ Gait的每个可能值,并使用<xsl:choose>
选择要使用的版本:
<xsl:choose>
<xsl:when test="$Gait = 'A'">
<xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)" />
</xsl:when>
<xsl:when test="$Gait = 'P'">
<xsl:value-of select="sum(key('kOffspring', ID)/Pace/Stakes)" />
</xsl:when>
etc.
<xsl:choose>
对我来说似乎更具可读性,并且可能更高效,具体取决于处理器;但这在很大程度上取决于偏好。