如何获取XML元素的逗号分隔字符串值?

时间:2015-12-15 17:57:19

标签: xml xslt xpath

有人可以帮助我在下面一个以逗号分隔的字符串中提取所有XML元素的要求吗?

XML

<ClassNumbers>
  <class>
    10433
  </class>
  <class>
    11980
  </class>
  <class>
    13799
  </class>
  <class>
    17392
  </class>
  <class>
    11234
  </class>
</ClassNumbers>

期望的输出:

10433,11980,13799,17392,11234

欢迎使用XPATH / XSLT解决此问题的任何建议。

3 个答案:

答案 0 :(得分:3)

XPath 2.0解决方案

string-join(//class/normalize-space(),',')

<强>结果

10433,11980,13799,17392,11234

Demo

答案 1 :(得分:2)

XSLT 1.0选项......

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

  <xsl:template match="text()">
    <xsl:value-of select="normalize-space()"/>
    <xsl:if test="following::text()">,</xsl:if>
  </xsl:template>

</xsl:stylesheet>

根据评论进行编辑...

XML输入

<ListofCLassNbrs xmlns="getClassNumberData">
    <ClassNumberData>
        <ClassNumber>45</ClassNumber>
    </ClassNumberData>
    <ClassNumberData>
        <ClassNumber>46</ClassNumber>
    </ClassNumberData>
    <ClassNumberData>
        <ClassNumber>47</ClassNumber>
    </ClassNumberData>
</ListofCLassNbrs>

XSLT 1.0

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

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

  <xsl:template match="text()">
    <xsl:value-of select="normalize-space()"/>
    <xsl:if test="following::text()">,</xsl:if>
  </xsl:template>

</xsl:stylesheet>

XML输出

<ClassNumberData>45,46,47</ClassNumberData>

如果出于某种原因需要专门匹配ClassNumber,可以将命名空间绑定到前缀...

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

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

  <xsl:template match="x:ClassNumber">
    <xsl:value-of select="normalize-space()"/>
    <xsl:if test="following::text()">,</xsl:if>
  </xsl:template>

</xsl:stylesheet>

答案 2 :(得分:1)

使用XSLT 2.0,您可以使用<xsl:value-of select="//class/normalize-space()" separator=","/>。确保使用像Saxon 9或XmlPrime

这样的XSLT 2.0处理器