concat几个节点xsl

时间:2011-04-25 21:38:48

标签: xml xslt

我的XML:

<?xml version="1.0"?>
<Result>
   <Answer questionId="Servicios">Auditoría|Asesoría en Impuestos|</Answer>
   <Answer questionId="Servicios">Auditoría|Outsourcing|Asesoría en RRHH|</Answer>
</Result>

我想使用node()或类似的东西将每个<xsl:variable name = "var"/>连接成一个UNIQUE变量(例如xsl:for-each),然后计算“|” char使用这个:

<xsl:variable name="total" select="string-length(string($var))-string-length(translate(string($var),'|',''))"/>

如果我这样做:

    <xsl:value-of select ="//Result/Answer[@questionId = 'Servicios']//text()"/>
<!--The return is something like an array-->
<!--[1]Auditoría|Asesoría en Impuestos|-->
<!--[2]Auditoría|Outsourcing|Asesoría en RRHH|-->
<!--and the result is '2' it only select the [1] and i need all of them, [1] and [2] in this case-->

我认为我必须将所有值与xsl:for-each

连接起来

即时使用xslt version="1.0"

我将不胜感激任何帮助! 谢谢!

3 个答案:

答案 0 :(得分:3)

产生所需结果的最短/最简单的XSLT转换Answer元素的字符串值的串联)

<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="/">
  <xsl:value-of select="."/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<Result>
    <Answer questionId="Servicios">Auditoría|Asesoría en Impuestos|</Answer>
    <Answer questionId="Servicios">Auditoría|Outsourcing|Asesoría en RRHH|</Answer>
</Result>

产生了正确的,正确的结果

Auditoría|Asesoría en Impuestos|Auditoría|Outsourcing|Asesoría en RRHH|

<强>解释

  1. 根节点/的字符串值是其所有文本节点后代的串联。

  2. <xsl:strip-space elements="*"/>指令从XML文档中删除了所有不需要的空白文本节点。

  3. 更新:如果XML文档比提供的文档更复杂并且需要进行一些过滤,那么这是一个通用且简单的解决方案,使用相同的想法:

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:variable name="vStrings">
      <xsl:copy-of select="/*/*[@questionId='Servicios']"/>
     </xsl:variable>
    
     <xsl:template match="/">
      <xsl:value-of select="$vStrings"/>
     </xsl:template>
    </xsl:stylesheet>
    

    应用于此XML文档(请注意,我们必须排除第二个<Answer>):

    <Result>
        <Answer questionId="Servicios">Auditoría|Asesoría en Impuestos|</Answer>
        <Answer questionId="X">Auditoría|Outsourcing|Asesoría en RRHH|</Answer>
        <Answer questionId="Servicios">Auditoría|Outsourcing|Asesoría en RRHH|</Answer>
    </Result>
    

    再次生成想要的正确结果:

    Auditoría|Asesoría en Impuestos|Auditoría|Outsourcing|Asesoría en RRHH|
    

答案 1 :(得分:2)

对于给定的文档,您可以使用normalize-space(Result)连接非常简单,但请注意,在计数代码中甚至不需要它。

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:value-of select="string-length(Result)-
            string-length(translate(Result,'|',''))"/> 
    </xsl:template>
</xsl:stylesheet>

只输出结果'5',甚至不使用for-each

OP编辑后

更新

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:variable name="var">
            <xsl:apply-templates select="//Answer[@questionId='Servicios']"/>
        </xsl:variable>
        <xsl:variable name="total" select="string-length($var)-
            string-length(translate($var,'|',''))"/>
        <xsl:value-of select="$total"/> 
    </xsl:template>
</xsl:stylesheet> 

答案 2 :(得分:0)

<!-- This will concatenate the nodes with a comma in between.  Is this what you want?-->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
    <xsl:template match="/*">
      <xsl:for-each select="Answer/text()">
        <xsl:value-of select="."/>
        <xsl:text>,</xsl:text>
      </xsl:for-each>
    </xsl:template>
  </xsl:stylesheet>