2

ノードのセットの文字列トークンをカウントするきちんとした XPath 式はありますか? 例えば;

<set>
  <hi>hello, there, world</hi>
  <hi>foo, bar</hi>
</set>

上記の例で必要な答えは value5です。1 つ目<hi>は 3 つのトークンを持っています。2 番目<hi>には 2 つのトークンがあります。

<set>には任意の数のノードを含めることができ、<hi>各ノードには任意の数のトークンを含めることができます。トークンは、コンマとそれに続くスペースで区切られた文字列です。

私はもう試した;

 <xsl:value-of select="count(str:tokenize(/set//hi, ', '))"/>

しかし、それは最初のノードのトークンの数を返します。3.

XSLT 1.0 を使用しています。(PHP libxml バージョン 2.7.3)

4

3 に答える 3

3

count(/set/hi/tokenize(., ', '))単一の式でそれを行うには、XPath 2.0 または XQuery 1.0 の表現力が必要です。

XSLT 1.0 では、値を反復して合計する必要があります。おそらく結果ツリーのフラグメントを中間結果のデータ構造として使用し、( を使用してexsl:node-set) 断片を合計するノードセットに変換します。

于 2013-07-19T17:28:54.020 に答える
1

あなたの定義を考えると

トークンは、コンマとそれに続くスペースで区切られた文字列です。

...カンマの数を数えて、文字列ごとに 1 を足すだけです。

これは、XSLT 1.0 で機能するちょっとしたハックtranslate()です。これは、時々役立つイディオムを利用しています。それが何をしているのか考えてみてください (イディオムを初めて使用する人にとっては、理解するのに少し時間がかかります)。

T:\ftemp>type commas.xml
<set>
  <hi>hello, there, world</hi>
  <hi>foo, bar</hi>
</set>
T:\ftemp>xslt commas.xml commas.xsl
5
T:\ftemp>type commas.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

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

<xsl:template match="set">
  <xsl:variable name="commas">
    <xsl:for-each select="hi">
      <xsl:value-of select="translate(.,translate(.,',',''),'')"/>
      <xsl:text>,</xsl:text>
    </xsl:for-each>
  </xsl:variable>
  <xsl:value-of select="string-length($commas)"/>
</xsl:template>

</xsl:stylesheet>
T:\ftemp>
于 2013-07-19T18:26:04.030 に答える
1

これは、XPath 2.0 では簡単にできることですが、残念ながら XPath 1.0 では追加の作業が必要になります。追加の手順でこれを行う方法はいくつかあります。これは私が使用するものです:

<xsl:variable name="tmp">
  <xsl:for-each select="//hi">
    <xsl:value-of select="concat(., ', ')"/>
  </xsl:for-each>
</xsl:variable>
<xsl:value-of select="count(str:tokenize($tmp, ', '))"/>
于 2013-07-19T19:24:34.523 に答える