XSLT:连接XML文件集合的文本
我构建了一个文本字符串,用于连接XML文件集合中的所有文本,使用:XSLT:连接XML文件集合的文本,xml,xslt,Xml,Xslt,我构建了一个文本字符串,用于连接XML文件集合中的所有文本,使用: <xsl:variable name="text-accumulated"> <xsl:for-each select="collection($collection-string)"> <xsl:copy-of select="//concat(text()[1], ' ')"/> </xsl:for-each>
<xsl:variable name="text-accumulated">
<xsl:for-each select="collection($collection-string)">
<xsl:copy-of select="//concat(text()[1], ' ')"/>
</xsl:for-each>
</xsl:variable>
注意:压缩空格会阻止单词在某些回车符(或换行符)周围合并
结果
这对我有用。但是我总是很小心使用/
我也知道,copy of
所做的深度复制的结果有时会让你大吃一惊。我使用了的值,得到了相同的结果
有没有更好的方法合并文件集合中的所有文本
是否存在我应该使用的内置函数(IRT,Saxon 9.5)
的值是否比的副本更好
此指令实际上并不复制XML文档的完整文本
以下是一个例子:
<a>
<b>X1<c>Y</c>X2</b>
</a>
如我们所见,输出中不存在字符串“X2
”
另一个问题是,不可能准确地识别在任何两个文本节点之间添加了哪些空格作为分隔符
换句话说,生成的输出并不完全是XML文档的文本节点的串联
如果您不关心后一个问题,使用空格作为分隔符连接文档中所有文本节点的正确XPath 2.0表达式如下:
//string-join(text(), ' ')
通过此更正,您提供的代码将变为:
<xsl:variable name="text-accumulated">
<xsl:for-each select="collection($collection-string)">
<xsl:copy-of select="//string-join(text(), ' ')"/>
</xsl:for-each>
</xsl:variable>
生成单个文本节点,其字符串值是所选项目的字符串值的串联(如果指定了separator
属性,则可能由分隔符字符串分隔)
另一方面,
<xsl:copy-of>
还不够吗?至于深度副本,你想创建任何节点吗?看起来你只是想要一个字符串值。Martin,它不会产生期望的结果,但我会处理它——它肯定是更简洁的代码。关于的副本的好提示:这可能会带来错误的节点(),值不会。你的select=“//concat(文本()[1],“”)
的xsl:copy上的无论如何都在计算字符串,而这种方式更像xsl:sequence
一样。如果您发布三到四个示例文档片段,其中您希望连接文本或字符串值,加上所需的结果,那么我们就可以更容易地告诉您想要实现什么和实现什么建议备选方案。//concat(text()[1],“”)
在我看来很不寻常,我不确定你想用它计算什么,但没有看到一些示例。这是一个出色的、有教育意义的答案。谢谢。关于“没有抓住所有内容”的第一点,我有一个小小的疑问---用我的XML,它做到了。无论如何,你的回答很好。马丁H的突出评论也值得一提。@Paulb,不客气。你可以找到这个包含XPath 2.0和XSLT 2.0的Pluralsight视频培训课程:
<xsl:variable name="text-accumulated">
<xsl:for-each select="collection($collection-string)">
<xsl:copy-of select="//string-join(text(), ' ')"/>
</xsl:for-each>
</xsl:variable>
<xsl:value-of>
<xsl:copy-of>
<xsl:variable name="text-accumulated">
<xsl:apply-templates select="collection($collection-string)" mode="mergeText"/>
</xsl:variable>
<xsl:template match="text()" mode="mergeText">
<xsl:value-of select="concat(., ' ')"/>
</xsl:template>