我是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>
欢迎任何建议。 关心Dirk
答案 0 :(得分:4)
您需要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验证了这一点:
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()
<强> II。 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