在XSLT中按范围限制输出

时间:2010-10-03 21:14:06

标签: xslt xpath xslt-2.0

我正在创建一个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;节点的值不在范围内

2 个答案:

答案 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 &lt; $fromRange and not(@parent)]
    |//org[chief > $toRange and not(@parent)]

此表达式将排除fromRangetoRange指定范围内的所有节点。

<?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 &lt; $fromRange and not(@parent)]|//org[chief > $toRange and not(@parent)]"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>