这个XSLT片段可以更简洁吗?

时间:2013-01-04 17:51:57

标签: xslt xpath xslt-1.0

在下面的代码片段中,我有3个for-each,但在我看来,它们应该能够组合成一个。它按原样工作,但我想知道是否有人知道更优雅的写作方式?

    <xsl:for-each select="/essentials/webservice">
        <xsl:for-each select="document(@filename)/productSearchResponse/products/product">
            <xsl:sort select="producingRegion" order="ascending"/> 
            <xsl:for-each select="producingRegion[not(preceding::producingRegion=.)]">
                <xsl:value-of select="."/>
                <br/>
            </xsl:for-each> 
        </xsl:for-each>
    </xsl:for-each>

1 个答案:

答案 0 :(得分:2)

如果不知道输入XML的预期结果和结构,很难给出答案,但我相信这应该有效。

<xsl:for-each select="/essentials/webservice">
    <xsl:for-each select="document(@filename)/productSearchResponse/products/product/producingRegion[not(preceding::producingRegion=.)]">
            <xsl:value-of select="."/>
            <br/>
    </xsl:for-each>
</xsl:for-each>

编辑:我刚注意到文档(@filename)是函数调用,而不是节点测试。在这种情况下,我认为你需要两个for-each es。

你可以通过在XPath表达式中使用双斜杠来使它更简洁,但我倾向于认为这不是一个很好的做法:

<xsl:for-each select="/essentials/webservice">
    <xsl:for-each select="document(@filename)//producingRegion[not(preceding::producingRegion=.)]">
            <xsl:value-of select="."/>
            <br/>
    </xsl:for-each>
</xsl:for-each>