2017-09-14 88 views
0

環境: XSLT 1.0
變換將各元件在partOne部和查找@field屬性使用@find屬性,然後輸出@value屬性partTwo部。有沒有辦法用XSLT變換中的apply-templates替換for-each?

我正在使用for-each循環,並想知道apply-templates是否可以工作?

XML

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="file.xslt"?> 

<xml> 
    <partOne> 
    <target field="hello"/> 
    <target field="world"/> 
    </partOne> 
    <partTwo> 
    <number input="2" find="hello" value="valone" /> 
    <number input="2" find="world" value="valtwo" /> 
    <number input="2" find="hello" value="valthree" /> 
    <number input="2" find="world" value="valfour" />  
    </partTwo> 
</xml> 

XSL

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="/xml/partOne/target"> 
    ,<xsl:value-of select="@field"/> 

    <xsl:for-each select="/xml/partTwo/number[@find=current()/@field]"> 
     ,<xsl:value-of select="@value"/> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

輸出:

,hello 
    ,valone 
    ,valthree 

,world 
    ,valtwo 
    ,valfour 

回答

2

好吧,看來簡單明瞭的改變

<xsl:for-each select="/xml/partTwo/number[@find=current()/@field]"> 
    ,<xsl:value-of select="@value"/> 
</xsl:for-each> 

<xsl:apply-templates select="/xml/partTwo/number[@find=current()/@field]"/> 

與模板

<xsl:template match="partTwo/number"> 
     ,<xsl:value-of select="@value"/> 
</xsl:template> 

當你的根模板迄今爲止處理,你需要將其更改爲

<xsl:template match="/"> 
    <xsl:apply-templates select="xml/partOne"/> 
    </xsl:template> 

避免處理所有元素partTwo元素(s)兩次。

對於您可能希望在兩個版本使用的一個關鍵的交叉引用:

<xsl:key name="ref" match="partTwo/number" use="@find"/> 

,然後select="key('ref', @field)"而不是select="/xml/partTwo/number[@find=current()/@field]"apply-templatesfor-each

+0

我得到所需的輸出,然後輸出一些...,valone,valtwo,valthree,valfour,那部分是不正確的。任何想法,爲什麼它這樣做? – Rod

+1

@Rod,請參閱編輯,您當前的方法會處理partTwo兩次,您需要更正匹配'/'的模板中的apply-templates。 –

+0

謝謝,這工作。但是,我認爲'apply-templates'的'select'表達式必須與模板的'match'表達式完全匹配? – Rod

相關問題