2010-12-18 17 views

答えて

3

未満のキーの文字列値を持つすべてのノードを返しますキーを(実行する方法があります)検索 演算子:GreaterThan/lessthanを使用して?

例:key()関数の第2引数は式でなければならないので、キー(「akeyname」、< 8)は 、キーストリング 値未満8

なしですべてのノードを返しますですが、"<8"は構文上有効なXPath式ではありません。

あなたが欲しいものに最も近い:

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

<xsl:key name="kLT8" match="num" use="not(. >= 8)"/> 

<xsl:template match="/"> 
    <result> 
    <xsl:copy-of select="key('kLT8', 'true')"/> 
    </result> 
</xsl:template> 
</xsl:stylesheet> 

このXMLドキュメントに適用された場合:

<nums> 
    <num>01</num> 
    <num>05</num> 
    <num>03</num> 
    <num>04</num> 
    <num>08</num> 
    <num>06</num> 
    <num>07</num> 
    <num>02</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

指名手配、正しい結果がが生成されます

<result> 
    <num>01</num> 
    <num>05</num> 
    <num>03</num> 
    <num>04</num> 
    <num>06</num> 
    <num>07</num> 
    <num>02</num> 
</result> 

さらに柔軟な解決策は、FXSL library(XSLTで完全に書かれています)によって長年にわたって実装されているXSLTでの高次関数(HOF)の使用です。ここ

はHOFsを用いた溶液である:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:f="http://fxsl.sf.net/"> 
<xsl:import href="../f/func-Operators.xsl"/> 
<xsl:import href="../f/func-filter.xsl"/> 

<xsl:param name="pLimit" as="xs:integer" select="8"/> 

<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/*"> 
    <xsl:sequence select="f:filter(*/number(), f:gt($pLimit))"/> 
</xsl:template> 
</xsl:stylesheet> 

この変換は、(上記の)同じXML文書に適用される場合、所望の、正しい結果が製造される:

1 5 3 4 6 7 2 

を注::HOFは、今後のバージョン3.0でXPath/XSLT/XQueryの標準機能になります。

+0

+1。あなたの答えを読むことは全く役に立ちます。キー引数として真を渡すことはすばらしい解決策です。 – Flack

+0

@Flack:大歓迎です。私はすぐにもっと興味深いものでこの答えを更新します。 –

+0

良い答えです、ありがとうございます。少なくとも私は単純な構文を見落としているわけではないことを知っています。私は検索が文字列のようになり、xpath文ではないと思った。私は、私がチャンスを取ったときにやろうとしていることについてもう少し文脈を掲示します。 –

関連する問題