3

xslt を使用して、指定された 2 つの値の間にある値のみを選択することは可能ですか?

すなわち

<value>1</value> 
<value>1.2</value>
<value>1.3</value>
<value>1.4</value>
<value>1.5</value>
<value>2</value> 
<value>2.1</value>
<value>2.3</value>
<value>2.4</value>
<value>2.5</value>

1 から 2 の間の値のみを表示したい。

4

3 に答える 3

1

そうです:

select="value[. &gt; 1 and . &lt; 2]"

1と2を含めたい場合:

select="value[. &gt;= 1 and . &lt;= 2]"

上限と下限が変数の場合 (ここでは例として $min と $max を使用):

select="value[. &gt; $min and . &lt; $max]"
于 2013-01-04T18:05:52.697 に答える
1

他の答えとは異なり、私は Identity Override を使用することを好みます

<?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:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="value[. &lt; 1 or . &gt; 2]"/>
</xsl:stylesheet>

出力:

<root>
  <value>1</value> 
  <value>1.2</value>
  <value>1.3</value>
  <value>1.4</value>
  <value>1.5</value>
  <value>2</value> 
</root>
于 2013-01-04T18:27:34.953 に答える
0

valu値が (提供された XML ドキュメントのように) 並べ替えられている場合、これはより高速になります。特に、最後に必要な要素の後にvalue多くの要素がある場合:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <xsl:variable name="vStart" select=
   "(*[.>=1][1]
   |
    *[1]
    )
     [last()]
   "/>

  <xsl:variable name="vEnd" select=
   "($vStart/following-sibling::*[. > 2][1]
                             /preceding-sibling::*[1]
   |
    *[last()]
    )
     [1]
   "/>

  <xsl:variable name="vPosRange" select=
  "count($vEnd/preceding-sibling::*) - count($vStart/preceding-sibling::*)"/>

  <xsl:copy-of select=
   "$vStart|$vStart/following-sibling::*[not(position() > $vPosRange)]"/>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<t>
    <value>1</value>
    <value>1.2</value>
    <value>1.3</value>
    <value>1.4</value>
    <value>1.5</value>
    <value>2</value>
    <value>2.1</value>
    <value>2.3</value>
    <value>2.4</value>
    <value>2.5</value>
</t>

必要な正しい結果が生成されます。

<value>1</value>
<value>1.2</value>
<value>1.3</value>
<value>1.4</value>
<value>1.5</value>
<value>2</value>

注意してください:

実際には、これにより、純粋な XPath 1.0 ソリューション が得られます$vPosRange。これは、$vStart$vEnd、それらが定義されている XPath 式を置き換えることができるためです。

于 2013-01-05T04:18:39.597 に答える