0

次のデータを連結する必要があります。しかし、私が受け取ったXMLドキュメントには、「ゼロからn」のb要素を含めることができます。言い換えると、b要素がない場合でも、xsltは正しく機能するはずです。例:

 <a>
   <b1>Some</b2>
   <b2>data</b2>
   <b3>what</b3>
   <b4>need</b4>
   <b5>to</b5>
   <b6>be</b6>
   <b7>concatenated</b7>
</a>

期待される結果

<a>
  <b1>Some data what need to be concatenated</b1>
</a>

私は次の構造を試していましたが、うまくいきませんでした。

<xsl:variable name="details" select="//b*"/>
<xsl:for-each select="$details">
    <!-- how can I concatenate the values of the b's to a variable????-->
</xsl:for-each>
 <!-- Process the variable for further needs-->

誰かが私にヒントを与えることができるといいのですが?よろしくダーク

4

2 に答える 2

2

XPathは常にワイルドカードなしで完全一致を実行しているため(おそらく名前空間を除く)、//b*を使用してbで始まるすべての要素を選択することはできません。したがって、// * [starts-with(name()、 "b")]を使用してb要素を選択する必要があります

次に、string-join関数を使用してXPathのみで連結を行うことができます。

string-join(//*[starts-with(name(), "b")]/text(), " ")
于 2013-01-14T21:46:58.383 に答える
1

これと同じくらい簡単(完全な変換):

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

 <xsl:template match="@*|node()">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="*[starts-with(name(), 'b')][1]">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
   <xsl:sequence select="../*[starts-with(name(), 'b')]/string()"/>
  </xsl:element>
 </xsl:template>
 <xsl:template match="text()[true()]| *[starts-with(name(), 'b')][position() gt 1]"/>
</xsl:stylesheet>

この変換が提供された(整形式に修正された)XMLドキュメントに適用される場合:

 <a>
   <b1>Some</b1>
   <b2>data</b2>
   <b3>what</b3>
   <b4>need</b4>
   <b5>to</b5>
   <b6>be</b6>
   <b7>concatenated</b7>
 </a>

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

<a>
   <b1>Some data what need to be concatenated</b1>
</a>
于 2013-01-15T03:54:17.163 に答える