【问题标题】:How to get comma-separated string values of XML elements?如何获取 XML 元素的逗号分隔字符串值?
【发布时间】:2015-12-15 17:57:18
【问题描述】:

有人可以帮忙解决以下在单个逗号分隔字符串中获取所有 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 解决此问题的任何建议。

【问题讨论】:

  • @Marc : //class/text() 提供所有元素,但不以分隔格式提供它们。我更多的是寻找包含 XML 的所有元素的分隔字符串。不过感谢您提供的信息。
  • @kjhughes:感谢您编辑 xml。我在使用 chrome 浏览器进行编辑时遇到了困难。

标签: xml xslt xpath


【解决方案1】:

XPath 2.0 解决方案

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

结果

10433,11980,13799,17392,11234

Demo

【讨论】:

  • 我尝试了您的解决方案,但出现以下错误。 SyntaxError: 字符串 'string-join(//class/normalize-space(),',')' 不是有效的 XPath 表达式。
  • 那么不幸的是,您的 XPath 处理器不理解 XPath 2.0,因为这是一个正确的 XPath 2.0 表达式。
  • 那个站点只使用 XPath 1.0,而不是 2.0。我添加了一个live demo link,它表明表达式通过 XPath 2.0 返回了您想要的结果。
  • @KranthiBandaru - 您的 xml 在默认命名空间中。由于您正在尝试 xpath 2.0,因此只需使用星号作为前缀:string-join(//*:ClassNumber/normalize-space(),',')
  • XPath 1.0 本身并不能胜任这项任务。如果您不能使用 XPath 2.0 库,则需要在 XPath 之外增加处理,例如通过 XSLT 使用 @DanielHaley shows for XSLT 1.0 或 Martin Honnen shows for XSLT 2.0
【解决方案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>

基于 cmets 编辑...

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>

【讨论】:

  • 我尝试了您的 xslt,但失败并出现错误。这是实际的 XML 454647 可以用你的 xslt 工具试试这个(如果你有的话)..
  • @KranthiBandaru - 错误是什么?您使用的是什么处理器/工具? Xalan 和 Saxon 对我来说都很好。
  • 我使用了以下 xslt w3.org/1999/XSL/Transform"> 用于我在之前评论中的 XMl。
  • 这里是错误 TID:[0] [ESB] [2015-12-15 15:58:21,135] 错误:无法使用 XSLT 转换:Value {name ='null', keyValue ='conf:/xslt/getClassNumbers.xslt'} 针对源 XPath : s11:Body/child::*[position()=1] | s12:Body/child::*[position()=1] reason : Unable to create an OMElement using XSLT result {org.apache.synapse.mediators.transform.XSLTMediator} org.apache.synapse.SynapseException: Unable to create an OMElement 在 rg.apache.synapse.mediators.transform.XSLTMediator.performXSLT(XSLTMediator.java:302) 处使用 XSLT 结果
  • 我什至尝试使用以下 XSLT &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:output method="xml"/&gt; &lt;xsl:strip-space elements="*"/&gt; &lt;xsl:template match="//ClassNumber/text()"&gt; &lt;xsl:value-of select="normalize-space()"/&gt; &lt;xsl:if test="following::text()"&gt;,&lt;/xsl:if&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;,即使上面的 XSLT 失败并出现相同的错误
【解决方案3】:

使用 XSLT 2.0,您可以使用 &lt;xsl:value-of select="//class/normalize-space()" separator=","/&gt;。确保使用 XSLT 2.0 处理器,例如 Saxon 9 或 XmlPrime

【讨论】:

    猜你喜欢
    • 2012-05-19
    • 2016-07-09
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2015-03-09
    • 2011-09-07
    • 2019-05-08
    相关资源
    最近更新 更多