4

次の構造の XML ファイルがあります。

<root>
    <level1>
        <level2>
            <value>A</value>
            <value>B</value>
            <value>C</value>
            <value>D</value>
            <value>E</value>
            <value>F</value>
        </level2>
    </level1>
</root>

ABC を取得するために、XSL の最初の 3 つの値のみを連結したいと思います。どうすればいいのですか?

4

4 に答える 4

6

フォーカス アイテムが level2 ノードであると仮定すると、次のような XSLT 1.0 シーケンス コンストラクターを使用できます...

<xsl:value-of select="concat(value[1],value[2],value[3])" />

...または XSLT 2.0 で...

<xsl:value-of select="for $i in 1 to 3 return value[$i]" />
于 2012-09-03T12:39:51.410 に答える
3

I. (増加する) 位置を指定して任意の値を連結する一般的で強力な方法を次に示します

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pPositions" select="'|1|2|3|'"/>

 <xsl:template match="value">
     <xsl:if test="contains($pPositions, concat('|',position(),'|'))">
      <xsl:value-of select="."/>
     </xsl:if>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<root>
    <level1>
        <level2>
            <value>A</value>
            <value>B</value>
            <value>C</value>
            <value>D</value>
            <value>E</value>
            <value>F</value>
        </level2>
    </level1>
</root>

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

ABC

value1 番目、3 番目、6 番目の要素の値を連結したい場合は、対応する$pPositionsパラメーターを指定するだけです。

 <xsl:param name="pPositions" select="'|1|3|6|'"/>

そして同じ、変更されていない XSLT コードが、今、望むものを生成します:

ACF

Ⅱ.位置のシーケンス (必ずしも増加するわけではない) がある場合、事態はさらに興味深いものになります。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pPositions">
  <p>4</p>
  <p>1</p>
  <p>3</p>
 </xsl:param>

 <xsl:variable name="vPositions" select=
      "document('')/*/xsl:param[@name='pPositions']"/>

 <xsl:template match="/">
  <xsl:variable name="vDoc" select="."/>

  <xsl:for-each select="$vPositions/p">
    <xsl:value-of select="$vDoc/*/*/*/value[position()=current()]"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

同じ XML ドキュメント (上記) に適用すると、必要な正しい結果が得られます。

DAC

III. これは、XSLT 2.0 では簡単です。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pPositions" as="xs:integer*" select="4,1,3"/>

 <xsl:template match="/">
  <xsl:value-of separator="" select=
   "for $n in $pPositions
     return
        /*/*/*/value[$n]
   "/>
 </xsl:template>
</xsl:stylesheet>
于 2012-09-03T14:50:26.813 に答える
3

これは、1 つの XPath で実行できます。

/root/level1/level2/value[position() &lt;= 3]/text()

それを XSLT に入れるには:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:copy-of select="root/level1/level2/value[position() &lt;= 3]/text()" />
  </xsl:template>
</xsl:stylesheet>
于 2012-09-03T12:39:35.243 に答える
1

あなたが使用することができます:

<xsl:value-of select=".//level2/string-join(value[position() &lt; 4] , '')" />        

これが役立つことを願っています。

于 2015-04-17T00:48:37.040 に答える