我正在创建一个XSLT,我想选择一个特定的节点,只要它的一个子元素的值在一个范围之间。范围将使用xsl文件中的参数指定。
XML文件就像
<root>
<org>
<name>foo</name>
<chief>100</chief>
</org>
<org parent="foo">
<name>foo2</name>
<chief>106</chief>
</org>
</root>
到目前为止,XSLT是
<xsl:param name="fromRange">99</xsl:param>
<xsl:param name="toRange">105</xsl:param>
<xsl:template match="/">
<xsl:element name="orgo">
<xsl:apply-templates select="//org[not(@parent)]"/>
</xsl:element>
</xsl:template>
我想限制org节点被处理的&lt;首席&gt;节点的值不在范围内
答案 0 :(得分:3)
我想选择一个特定的节点, 只有它的一个子元素 值在一个范围之间。范围是 使用参数指定 xsl文件。
我也想要限制 节点不应该有
paren
t 属性以及范围
将此表达式用作select
的{{1}}属性的值:
<xsl:apply-templates>
在XSLT 2.0中,在匹配模式中包含变量/参数是合法的。。
因此,可以写一下:
org[not(@parent) and chief >= $fromRange and not(chief > $toRange)]
因此有效地排除了处理中的所有此类<xsl:template match=
"org[@parent or not(chief >= $fromRange ) or chief > $toRange]"/>
元素。
然后匹配文档节点的模板只是:
org
这比XSLT 1.0解决方案更好,因为它更像是“推式”。
答案 1 :(得分:0)
//org[chief < $fromRange and not(@parent)]
|//org[chief > $toRange and not(@parent)]
此表达式将排除fromRange
和toRange
指定范围内的所有节点。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="fromRange">99</xsl:param>
<xsl:param name="toRange">105</xsl:param>
<xsl:template match="/">
<xsl:element name="orgo">
<xsl:apply-templates select="//org[chief < $fromRange and not(@parent)]|//org[chief > $toRange and not(@parent)]"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>