XSLT3 使用分隔符连接值

XSLT3 joining values with separator

我是 XSLT 的新手,我一直在努力复制这里提到的解决方案 XSL for-each: how to detect last node? 比我愿意承认的时间还要长:(

我已经设置了这个 fiddle。 https://xsltfiddle.liberty-development.net/naZXVFi

我希望我可以只使用 value-of + 分隔符,而不是 choose / when xslt 工具,因为它看起来更惯用。

期望的输出: skill1, skill2, skill3, skill4, skill5(最后一个没有逗号space)

如有任何帮助,我们将不胜感激。谢谢。

编辑:这里也包括代码: xml: (需要添加 ref 到 xslt):

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?> <!-- not in fiddle -->

<skills>
    <skill>skill1</skill>
    <skill>skill2</skill>
    <skill>skill3
        <details>
            <detail>detail1</detail>
            <detail>detail2</detail>
        </details>
    </skill>
    <skill>skill4</skill>
    <skill>skill5</skill>
</skills>

test.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:array="http://www.w3.org/2005/xpath-functions/array"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>.NET XSLT Fiddle Example</title>
      </head>
      <body>
         <xsl:for-each select="/skills/skill">
            <xsl:value-of select="." separator=", "/>
        </xsl:for-each>
      </body>
    </html>


  </xsl:template>

</xsl:stylesheet>

通常,使用 XSLT 2/3 输出由一些分隔符字符串分隔的序列,您只需使用 xsl:value-of select="$sequence"separator 属性中的适当分隔符字符串(而不是 for-each):

  <xsl:template match="skills">
    <xsl:value-of select="skill/text()[normalize-space()]/normalize-space()" separator=", "/>
  </xsl:template>

https://xsltfiddle.liberty-development.net/naZXVFi/1

在大多数情况下你只需要 select="skill" separator=", " 但考虑到你的后代和白色 space 你似乎想要消除上面的 select 表达式有点复杂。

为您提供了获得最终结果的详细方法,包括去除多余的空格等,但在较高层次上,这里是如何将 xsl:value-of 与 [= 一起使用13=]正确。

你有:

  <body>
     <xsl:for-each select="/skills/skill">
        <xsl:value-of select="." separator=", "/>
    </xsl:for-each>
  </body>

这表示对于每个技能节点,取该节点的内容并显示它。值得注意的是,value-of 一次只能看到一个技能,所以没有任何东西可以用逗号分隔符加入。

可以得到你想要的答案是:

  <body>
        <xsl:value-of select="/skills/skill" separator=", "/>
  </body>

这表示获取技能节点集并显示以逗号分隔符连接的节点。您可以在 https://xsltfiddle.liberty-development.net/naZXVFi/4

处看到输出