连接多个节点xsl

发布于 2024-11-03 10:27:38 字数 1077 浏览 0 评论 0原文

我的 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() 连接到一个 UNIQUE 变量(例如 ) xsl:for-each 或类似的东西,然后计算“|”使用此字符:

<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"

我将不胜感激! 谢谢!

My 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>

I want to concat each node() into a UNIQUE variable (<xsl:variable name = "var"/> for example) using xsl:for-each or something like that, then count the "|" char using this:

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

If i do this:

    <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-->

I think i must concatenate all the values with xsl:for-each

im using xslt version="1.0"

I would appreciate any help!
Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甩你一脸翔 2024-11-10 10:27:38

产生所需结果的最短/最简单的 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. 指令从 XML 文档中消除所有不需要的纯空白文本节点。

更新:如果 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 文档时(请注意,我们必须排除第二个):

<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|

The shortest/simplest XSLT transformation that produces the wanted result (the concatenation of the string-values of the Answer elements) is this:

<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>

When applied on the provided XML document:

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

exactly the wanted, correct result is produced:

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

Explanation:

  1. The string value of the root node / is the concatenation of all of its text-node descendents.

  2. The <xsl:strip-space elements="*"/> directive eliminates from the XML document all unwanted whitespace-only text nodes.

Update: If the XML document is more complex than the provided one and some filtering is required, here is a general and simple solution, using the same idea:

<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>

when applied on this XML document (note that we must exclude the second <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>

again the wanted, correct result is produced:

Auditoría|Asesoría en Impuestos|Auditoría|Outsourcing|Asesoría en RRHH|
柳若烟 2024-11-10 10:27:38

对于给定的文档,您可以使用 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> 

For the given document, you can concatenate pretty simple with normalize-space(Result) but note that it is not even necessary in your count code.

This stylesheet:

<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>

just outputs the result '5' without even using a for-each.

UPDATE after OP's edit:

<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> 
可爱咩 2024-11-10 10:27:38
<!-- 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>
<!-- 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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文