Ограничить вывод диапазоном в XSLT - PullRequest
1 голос
/ 04 октября 2010

Я создаю 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, чье значение узла не находится в диапазоне

Ответы [ 2 ]

3 голосов
/ 04 октября 2010

Я хочу выбрать конкретный узел, только если один из его дочерних элементов значение находится в диапазоне. Диапазон указывается с использованием параметров в файл xsl.

Я также хочу, чтобы ограничение узел не должен иметь paren т атрибут вместе с диапазоном

Используйте это выражение в качестве значения атрибута select <xsl:apply-templates>:

org[not(@parent) and chief >= $fromRange and not(chief > $toRange)]

В XSLT 2.0 допустимо иметь переменные / параметры в шаблоне сопоставления .

Следовательно, можно написать:

<xsl:template match=
  "org[@parent or not(chief >= $fromRange ) or chief > $toRange]"/>

, таким образом, эффективно исключая все такие org элементы из обработки.

Тогда шаблон, соответствующий узлу документа, просто :

<xsl:template match="/">            
    <orgo>            
        <xsl:apply-templates/>            
    </orgo>            
</xsl:template>

Это лучше, чем решение XSLT 1.0, потому что оно более "push-style".

0 голосов
/ 04 октября 2010
//org[chief &lt; $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 &lt; $fromRange and not(@parent)]|//org[chief > $toRange and not(@parent)]"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>
...