XPath 中的变量 select 以避免代码重复
Variable in XPath select to avoid code duplication
我想在 XSL 变量中表示一个 XPath 表达式(或使用其他技术),然后使用该存储的表达式多个 XSLT select 参数。 (XPath 表达式很复杂,我想 define/maintain 它在一个地方。)
我正在使用 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>
变量存储表达式的计算结果 - 而不是表达式本身。
为了实现避免代码重复的目标,请考虑先创建过滤节点集,然后将 谓词 应用于 select 子集 - 例如:
<xsl:variable name="my-set" select= "node[@attr1!='aaa' and @attr1!='bbb']" />
和:
<xsl:for-each select="$my-set[parent::AAA]">
我想在 XSL 变量中表示一个 XPath 表达式(或使用其他技术),然后使用该存储的表达式多个 XSLT select 参数。 (XPath 表达式很复杂,我想 define/maintain 它在一个地方。)
我正在使用 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>
变量存储表达式的计算结果 - 而不是表达式本身。
为了实现避免代码重复的目标,请考虑先创建过滤节点集,然后将 谓词 应用于 select 子集 - 例如:
<xsl:variable name="my-set" select= "node[@attr1!='aaa' and @attr1!='bbb']" />
和:
<xsl:for-each select="$my-set[parent::AAA]">