這個問題從查詢如下上XSLT: Sorting based on sum of values from other nodesXSLT:路徑的替代部分取決於參數
我已經修飾以接收參數「步態」,其可以具有值I有這片的XSLT(感謝德米特) 'P'(PACE), 'T'(小跑)或 '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>
當$步態是 'A' 我想總和(鍵( 'kOffspring',ID)/ * /錦標(看在馬的所有子節點)
當$步態是 'P' 我想總和(鍵( 'kOffspring',ID)/佩斯/錦標(看在佩斯節點才發現錦標)
當$步態「 T'我想要sum(key('k後代',ID)/小跑/籌碼(在Trot節點中查找只能找到Stakes)
所以這是超簡化的例子。我試圖停止重複上百行代碼來迎合$ Gait的不同值。我在嘗試使用變量時玩過,但在路徑中使用密鑰時看不到如何更改節點路徑的值。我看到我可能在'match =「/ *」'模板中使用了一個選擇語句,但這只是用於排序,當我到達'Sire'模板時我仍然卡住 - 不想將'選擇'圍繞我所擁有的所有'選擇'值'的陳述'。
感謝您的任何建議。 Regards, Bryce Stenberg。
嗨邁克爾,那看起來不錯。當我試圖在Pace和Trot節點上匹配時,我只是不知道設置$ Gait的值是多少?我嘗試了空字符串和'*'作爲值,但沒有奏效。我看到我可以使用像Pacers和Trotters這樣的兩個參數,它們在頂層適當設置(值或null)並使用'sum(key('kOffspring',ID)/ * [name()= $ Pacers和name()= $如果你有一個更好的方法,乾杯,布萊斯 – user1840734
woops - 那應該是'或',如:sum(key('kOffspring',ID)/ * [name( )= $ Pacers或name()= $ Trotters]/Stakes' :-) ....'以'更好的方式'我的意思是隻用一個參數來做,因爲一些我更復雜的xslt/xml有5個不同的可能節點參與 – user1840734
你可以定義一個變量$ Gaits,它是一串字符串,然後[name()= $ Gaits]將是真的,如果這個名字等於它們中的任何一個 –