2015-09-08 90 views
2

我的色彩元素的這樣一個順序:XSLT 1.0:高效地比較兩個節點集的匹配

<Colors> 
    <Color Name ="AliceBlue" Hex="#F0F8FF"/> 
    <Color Name ="AntiqueWhite" Hex="#FAEBD7"/> 
    <!-- more values... --> 
</Colors> 

和文字序列:

<Words> 
    <Element>1px</Element> 
    <Element>Blue</Element> 
    <Element>Solid</Element> 
</Words> 

什麼是有效的方式來找到Colors/Color/@name屬性與Words/Element/text()中的節點完全匹配,並檢索該@name?

+3

這兩個節點集在同一個文檔中嗎?如果是,請使用[鍵](http://www.w3.org/TR/xslt/#key)。如果不是的話,無論如何都要使用密鑰 - 但設置起來會稍微複雜一些。 - P.S.實際匹配的例子會更有用,預期的輸出也是如此。 - P.P.S.這裏沒有「十字路口」;兩個集合都不共有節點。 –

+0

相應地編輯標題。 –

回答

4

由於@ michael.hor257k建議,你可以使用這個鍵;假設此示例文件:

<root> 
    <Colors> 
    <Color Name ="AliceBlue" Hex="#F0F8FF"/> 
    <Color Name ="AntiqueWhite" Hex="#FAEBD7"/> 
    <Color Name="AnotherColor" Hex="123" /> 
    <!-- more values... --> 
    </Colors> 
    <Words> 
    <Element>1px</Element> 
    <Element>Blue</Element> 
    <Element>AntiqueWhite</Element> 
    <Element>AliceBlue</Element> 
    </Words> 
</root> 

這XSLT:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

    <xsl:key name="colors" match="/root/Colors/Color" use="@Name" /> 
    <xsl:template match="/root/Words/Element[key('colors', .)]"> 
      <xsl:value-of select="." /> 
    </xsl:template> 

    <xsl:template match="text()" /> 
</xsl:transform> 

將輸出的匹配在兩個ElementColor節點是顏色的名稱。這裏是XSLTransform