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 工具,因为它看起来更惯用。
- 我无法显示分隔符;
- 我也不行select只是技艺之子,我总得子孙。也就是说,我不应该在输出中看到任何
detail
。
- 奖励:不确定为什么元标记不能自动关闭(html 部分中的警告)
期望的输出:
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
处看到输出
我是 XSLT 的新手,我一直在努力复制这里提到的解决方案 XSL for-each: how to detect last node? 比我愿意承认的时间还要长:(
我已经设置了这个 fiddle。 https://xsltfiddle.liberty-development.net/naZXVFi
我希望我可以只使用 value-of + 分隔符,而不是 choose / when xslt 工具,因为它看起来更惯用。
- 我无法显示分隔符;
- 我也不行select只是技艺之子,我总得子孙。也就是说,我不应该在输出中看到任何
detail
。 - 奖励:不确定为什么元标记不能自动关闭(html 部分中的警告)
期望的输出:
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
处看到输出