2013-01-09 89 views
1

我有通過ID屬性的許多一對多的關係的XML代碼段,一個例子是,像這樣結合節點:很多一對多的關係

<root> 
    <foolist name="firstlist"> 
    <foo barid="1" someval="some"/> 
    <foo barid="1" someval="other"/> 
    <foo barid="2" someval="third"/> 
    </foolist> 
    <foolist name="secondlist"> 
    <!-- there might be more foo's here that reference the same 
     bars, so foo can't be a child of bar --> 
    </foolist> 
    <bar id="1" baz="baz" qux="qux"/> 
    <bar id="2" bax="baz2" qux="qux2"/> 
</root> 

說我想出來的以下:

baz-some-qux 
baz-other-qux 
baz2-third-qux2 

(即插入巴茲和qux從引用的項目的值之間someval的值),我應該怎麼辦呢?如果我想使用模板作爲欄,我需要兩個不同的模板。我可能錯過了一些非常基本的東西,所以我提前道歉。

(編輯:擴展示例)

+0

的Martijn,你可能會感興趣的一個更有效的,基於密鑰的解決方案。 –

回答

1

這應該做的伎倆:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="foo"> 
     <xsl:variable name="matchingBar" select="../../bar[@id = current()/@barid]" /> 
     <xsl:value-of select="concat($matchingBar/@baz, '-', ./@someval, '-', $matchingBar/@qux, '&#xA0;')" /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

感謝您的回答!不應該爲每個條元素處理每個foo元素。我會稍微擴展一下我的問題來澄清。 – Martijn

+0

已更新的示例。 – JLRishe

2

一種有效的解決方案,使用鍵

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kFooById" match="foo" use="@barid"/> 

<xsl:template match="bar"> 
    <xsl:apply-templates select="key('kFooById', @id)" mode="refer"> 
    <xsl:with-param name="pReferent" select="."/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="foo" mode="refer"> 
    <xsl:param name="pReferent" select="/.."/> 

    <xsl:value-of select= 
    "concat($pReferent/@baz,'-',@someval,'-',$pReferent/@qux,'&#xA;')"/> 
</xsl:template> 
</xsl:stylesheet> 

當該變換被應用上提供的XML文檔(針對良好格式進行了更正):

<root> 
    <foolist name="firstlist"> 
    <foo barid="1" someval="some"/> 
    <foo barid="1" someval="other"/> 
    <foo barid="2" someval="third"/> 
    </foolist> 
    <foolist name="secondlist"> 
    <!-- there might be more foo's here that reference the same 
     bars, so foo can't be a child of bar --> 
    </foolist> 
    <bar id="1" baz="baz" qux="qux"/> 
    <bar id="2" baz="baz2" qux="qux2"/> 
</root> 

的希望,正確的結果產生:

baz-some-qux 
baz-other-qux 
baz2-third-qux2