gpt4 book ai didi

xslt-2.0 - 迭代包含 CDATA 的节点并连接它们以及如何检索连接数据的特定数据

转载 作者:行者123 更新时间:2023-12-04 23:01:37 25 4
gpt4 key购买 nike

我是 XSLT 的新手,需要解决一个棘手的问题,我没有任何改变来解决它。
以下示例描述了我的问题:

<a>
<b1><![CDATA[<CdtrRefInf><Issr>XXX</Issr></Tp><Ref>123456123]]></b1>
<b2><![CDATA[193</Ref></CdtrRefInf>]]></b2>
</a>

预期的结果应该是:
<a>
<b1>123456123193<b1>
</a>

我需要遍历元素 b1 和 b2 并将内容连接到一个变量中。然后我需要获取 Ref 元素的内容并将其放入 b1 元素中。
以下代码将字段 b1 和 b2 的内容连接在一起。
但是如何把它放在上面的格式????


<xsl:template match="/*">
<xsl:variable name="vMyVars">
<xsl:apply-templates select="b1 | b2 " mode="vMyVars"/>
</xsl:variable>
<xsl:value-of select="substring($vMyVars, -1, string-length($vMyVars))"/>
</xsl:template>

<xsl:template match="*" mode="vMyVars"/>

<xsl:template match="*[normalize-space()]" mode="vMyVars">
<xsl:value-of select="."/>
<!--<xsl:text>, </xsl:text>-->
</xsl:template>

欢迎任何建议。
问候德克

最佳答案

为此,您需要 XPath 3.0 (XSLT 3.0)。只需使用 :

 parse-xml(concat(/*/b1, /*/b2))/*/Ref/text()

您还需要更正 CDATA 部分 中的文本——它包含 </Tp>——一个没有相应起始标签的结束标签。我将其更正为: <Tp/>

对提供的 XML 文档进行此更正后,现在是 :
<a>
<b1><![CDATA[<CdtrRefInf><Issr>XXX</Issr></Tp><Ref>123456123]]></b1>
<b2><![CDATA[193</Ref></CdtrRefInf>]]></b2>
</a>

对上述 XML 文档的上述 XPath 3.0 表达式的求值产生所需的正确结果 :
123456123193

我使用这个 XQuery 3.0 用 BaseX 验证了这一点:
let $top :=
<a>
<b1><![CDATA[<CdtrRefInf><Issr>XXX</Issr><Tp/><Ref>123456123]]></b1>
<b2><![CDATA[193</Ref></CdtrRefInf>]]></b2>
</a>

return
parse-xml(concat($top/b1, $top/b2))/*/Ref/text()

二。 XSLT 2.0 中的解决方案

XSLT 2.0 不提供将字符串解析为 XML 文档/片段的简单函数或指令。

在 Saxon 中,可以使用 saxon:parse() 扩展函数:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://saxon.sf.net/">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/*">
<xsl:copy-of select="saxon:parse(concat(/*/b1, /*/b2))/*/Ref/text()"/>
</xsl:template>
</xsl:stylesheet>

在提供的 XML 文档 上使用 Saxon 9.1.07 执行此转换时:
<a>
<b1><![CDATA[<CdtrRefInf><Issr>XXX</Issr><Tp/><Ref>123456123]]></b1>
<b2><![CDATA[193</Ref></CdtrRefInf>]]></b2>
</a>

产生了想要的正确结果 :
123456123193

关于xslt-2.0 - 迭代包含 CDATA 的节点并连接它们以及如何检索连接数据的特定数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14298020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com