XPath中的变量选择以避免代码重复

时间:2015-01-14 11:39:44

标签: xslt xpath xslt-1.0

我想在XSL变量中表示XPath表达式(或使用其他技术),然后使用该存储表达式多个XSLT选择参数。 (XPath表达式很复杂,我想在一个地方定义/维护它。)

我正在使用msxsl,它使用XSL 1.0。

在下面的工作示例代码中,我希望避免重复" @ attr1!=' aaa'和@ attr1!=' bbb'"。

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

    <xsl:template match="/">
    <results>
        <xsl:for-each select="//node[@attr1 != 'aaa' and @attr1 != 'bbb']">
            <result-node parent="AAA">
                <xsl:value-of select="@value"/>
            </result-node>
        </xsl:for-each>

        <xsl:for-each select="//node[@attr1 != 'aaa' and @attr1 != 'bbb']">
            <result-node parent="BBB">
                <xsl:value-of select="@value"/>
            </result-node>
        </xsl:for-each>
    </results>
    </xsl:template>

</xsl:transform>

以下是使用上述代码处理时输出的示例XML。

XML:

<root>
    <AAA>
        <node attr1="aaa" value="1"/>
        <node attr1="bbb" value="2"/>
        <node attr1="ccc" value="3"/>
        <node attr1="ddd" value="4"/>
    </AAA>
    <BBB>
        <node attr1="aaa" value="5"/>
        <node attr1="bbb" value="6"/>
        <node attr1="ccc" value="7"/>
        <node attr1="ddd" value="8"/>
    </BBB>
</root>

输出:

<results>
   <result-node parent="AAA">3</result-node>
   <result-node parent="AAA">4</result-node>
   <result-node parent="AAA">7</result-node>
   <result-node parent="AAA">8</result-node>
   <result-node parent="BBB">3</result-node>
   <result-node parent="BBB">4</result-node>
   <result-node parent="BBB">7</result-node>
   <result-node parent="BBB">8</result-node>
</results>

1 个答案:

答案 0 :(得分:2)

变量存储评估表达式的结果 - 而不是表达式本身。

要实现避免代码重复的目标,请考虑首先创建过滤的节点集,然后应用谓词来选择子集 - 例如:

<xsl:variable name="my-set" select= "node[@attr1!='aaa' and @attr1!='bbb']" />

<xsl:for-each select="$my-set[parent::AAA]">