当前位置 : 主页 > 网络推广 > seo >

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

来源:互联网 收集:自由互联 发布时间:2021-06-16
我是XSLT的新手,需要解决一个讨厌的问题,我没有改变来解决它. 以下示例描述了我的问题: a b1![CDATA[CdtrRefInfIssrXXX/Issr/TpRef123456123]]/b1 b2![CDATA[193/Ref/CdtrRefInf]]/b2/a 预期的结果应该是: a
我是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

我用BaseX使用这个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
网友评论