2

ソース:

  <Data>
     <value>M1,M2,M3,M4,M5,M6</value>
  </Data>

それらを次のように表示する必要があります

出力:

    <ABCD>
        <value1>M1</value1>
        <value2>M2</value2>
        <value3>M3</value3>
        <value4>M4</value4>
        <value5>M5</value5>
        <value6>M6</value6>
    </ABCD>

XSLT:

実際には、「、」に基づいて値を分割し、それらを異なる変数に配置したいと思います。str-split()を使用して、さまざまな変数にロードできますか?

4

2 に答える 2

3

このXSLT1.0変換

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

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

 <xsl:template match="value/text()" name="split">
  <xsl:param name="pText" select="."/>
  <xsl:param name="pOrd" select="1"/>

  <xsl:if test="$pText">
    <xsl:element name="value{$pOrd}">
      <xsl:value-of select=
        "substring-before(concat($pText, ','), ',')"/>
    </xsl:element>

    <xsl:call-template name="split">
      <xsl:with-param name="pText" select="substring-after($pText, ',')"/>
      <xsl:with-param name="pOrd" select="$pOrd+1"/>
    </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

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

<Data>
    <value>M1,M2,M3,M4,M5,M6</value>
</Data>

必要な正しい結果を生成します

<ABCD>
   <value1>M1</value1>
   <value2>M2</value2>
   <value3>M3</value3>
   <value4>M4</value4>
   <value5>M5</value5>
   <value6>M6</value6>
</ABCD>

説明

  1. 再帰的な名前付きテンプレート。渡されたtext-parameterが空の文字列になると停止条件が適用されます。

  2. xsl:elementおよびAVTの適切な使用。

  3. 標準のXPath関数の適切な使用substring-before()substring-after

  4. 番兵を適切に使用してコードを簡素化し、より効率的にします。

于 2012-06-27T03:39:29.607 に答える
0

EXSLTにアクセスできる場合は、を使用できますstr:split()

<xsl:apply-templates select='str:split(/Data/value, ",")' />

ここで実行可能な例

于 2012-06-26T12:47:21.923 に答える