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

您不能使用 //b* 来选择所有以 b 开头的元素,因为 XPath 总是在没有通配符的情况下进行精确匹配(可能除了命名空间之外)。所以你需要使用 //*[starts-with(name(), "b")] 来选择 b 元素

然后,您可以使用字符串连接函数单独在 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 回答