XSLT:根据参数替换路径的一部分

时间:2012-11-26 01:52:25

标签: xslt xpath xslt-2.0

此问题从查询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'模板时我仍然被卡住 - 不想放'选择'围绕'我所拥有的众多'选择'价值。

感谢您的任何建议。 问候,   布莱斯斯滕贝格。

2 个答案:

答案 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>对我来说似乎更具可读性,并且可能更高效,具体取决于处理器;但这在很大程度上取决于偏好。