2012-05-31 39 views
2

源XML是這樣的:如何選擇要素依賴於文本內容使用XSLT

<source> 
    <idset> 
     1,2,4 
    </ideset> 
    <c id = "1">aaa</c> 
    <c id = "2">bbb</c> 
    <c id = "3">ccc</c> 
    <c id = "4">ddd</c> 
</source> 

使用idset內容「1,2,4」,以產生新的XML,像這樣:

<result> 
    aaabbbddd 
</result> 

我覺得應該用文本「1,2,4」作爲一個參數,但我不知道如何做到這一點

+0

這不是你在做什麼試圖在http://stackoverflow.com/questions/10827744/how-to-translate-xml-using-xslt-with-complex-rules? –

回答

0

使用基於你前面的問題XSLT 2.0 ...

輸入XML

<source> 
    <idset> 
     1,2,4 
    </ideset> 
    <c id = "1">aaa</c> 
    <c id = "2">bbb</c> 
    <c id = "3">ccc</c> 
    <c id = "4">ddd</c> 
</source> 

XSLT 2.0

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

    <xsl:template match="/source"> 
     <result> 
      <xsl:apply-templates select="c[@id=tokenize(normalize-space(current()/idset),',')]/text()"/>    
     </result> 
    </xsl:template> 
</xsl:stylesheet> 

XML輸出

<result>aaabbbddd</result> 
0

的XSLT 1.0溶液

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <result> 
    <xsl:apply-templates select="c"/> 
    </result> 
</xsl:template> 
<xsl:template match= 
"c[not(contains(concat(',', normalize-space(/*/idset), ','), 
       concat(',', @id, ',') 
       ) 
     ) 
    ]"/> 
</xsl:stylesheet> 

當這種轉變是在所提供的XML文檔應用:

<source> 
    <idset> 
    1,2,4 
    </idset> 
    <c id = "1">aaa</c> 
    <c id = "2">bbb</c> 
    <c id = "3">ccc</c> 
    <c id = "4">ddd</c> 
</source> 

想要的,正確的結果產生

<result>aaabbbddd</result>