2

在下面的代码片段中,我有 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>
4

1 回答 1

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>

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

您可以通过在 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>
于 2013-01-04T17:58:22.557 回答