gpt4 book ai didi

xml - XSLT:如何使用 XSLT 1.0 和 XALAN 处理器转换部分转义的 XML?

转载 作者:数据小太阳 更新时间:2023-10-29 02:12:18 29 4
gpt4 key购买 nike

我有这个:

<root>
<row>
<field>&amp;lt;![CDATA[&amp;lt;comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema"&amp;gt;
&amp;lt;inicioCFD&amp;gt;
&amp;lt;idArchivo&amp;gt;182NAI053402&amp;lt;/idArchivo&amp;gt;
&amp;lt;etiquetaCFD&amp;gt;NCR&amp;lt;/etiquetaCFD&amp;gt;
&amp;lt;/inicioCFD&amp;gt;
&amp;lt;/comprobante&amp;gt;]]&amp;gt;</field>
</row>
</root>

我需要这个:

<comprobante>
<idArchivo etiquetaCFD="NCR">182NAI053402</idArchivo>
</comprobante>

我正在使用这个 xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
xmlns:a="http://www.tralix.com/cfd/2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema"
xmlns:xalan="http://xml.apache.org/xalan"
extension-element-prefixes="exsl xalan">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="/root/row/field">
<xsl:variable name="comprobante_">
<xsl:variable name="p6">
<xsl:variable name="p5">
<xsl:variable name="p4">
<xsl:variable name="p3">
<xsl:variable name="p2">
<xsl:variable name="p1">
<xsl:value-of select="substring-before(substring-after(.,'CDATA['),']]')"/>
</xsl:variable>
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="$p1"/>
<xsl:with-param name="replace" select="'gt;'" />
<xsl:with-param name="with" select="'¬'"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="$p2"/>
<xsl:with-param name="replace" select="'lt;'"/>
<xsl:with-param name="with" select="'~'"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="$p3"/>
<xsl:with-param name="replace" select="'&amp;~'"/>
<xsl:with-param name="with" select="'&lt;'"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="$p4"/>
<xsl:with-param name="replace" select="'&amp;¬'"/>
<xsl:with-param name="with" select="'&gt;'"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$p5" disable-output-escaping="yes"/>
</xsl:variable>
<xsl:copy-of select="xalan:nodeset($p6)"/>
</xsl:variable>
<xsl:variable name="comprobante" select="xalan:nodeset($comprobante_)"/>
<comprobante>
<idArchivo>
<xsl:attribute name="etiquetaCFD">
<xsl:value-of select="$comprobante/comprobante/inicioCFD/etiquetaCFD"/>
</xsl:attribute>
<xsl:value-of select="$comprobante/comprobante/inicioCFD/idArchivo"/>
</idArchivo>
</comprobante>
</xsl:template>
<xsl:template name="replace-string">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="with"/>
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:value-of select="substring-before($text,$replace)"/>
<xsl:value-of select="$with"/>
<xsl:call-template name="replace-string">
<xsl:with-param name="text"
select="substring-after($text,$replace)"/>
<xsl:with-param name="replace" select="$replace"/>
<xsl:with-param name="with" select="$with"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

它产生这个:

<comprobante>
<idArchivo etiquetaCFD=""></idArchivo>
</comprobante>

空值是因为转义的 XML 不是像帖子 XSLT: How to transform partially escaped XML? 那样的 XML。说,所以我无法从我的 $comprobante 变量中读取任何内容。

但在那篇文章中,Dimitri 说可以使用 saxon:parse()。好吧,我正在使用 Xalan 处理器,但我找不到类似的东西。我仅限于使用 xalan 和 xslt 1.0。

有什么帮助吗?

提前致谢

最佳答案

像这样的东西会从 field 中提取转义的内容并将其输出为纯文本(恰好是格式正确的 XML):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" />

<xsl:template match="/">
<xsl:variable name="withoutCDataStart"
select="substring(root/row/field, 13)" />
<xsl:variable name="withoutCDataEnd"
select="substring($withoutCDataStart, 1,
string-length($withoutCDataStart) - 6)" />

<xsl:call-template name="unescape">
<xsl:with-param name="text" select="$withoutCDataEnd" />
</xsl:call-template>
</xsl:template>

<xsl:template name="unescape">
<xsl:param name="text" />
<xsl:choose>
<xsl:when test="contains($text, '&amp;')">
<xsl:value-of select="substring-before($text, '&amp;')" />
<xsl:variable name="afterAmp" select="substring-after($text, '&amp;')" />
<xsl:choose>
<xsl:when test="starts-with($afterAmp, 'amp;')">&amp;</xsl:when>
<xsl:when test="starts-with($afterAmp, 'lt;')">&lt;</xsl:when>
<xsl:when test="starts-with($afterAmp, 'gt;')">&gt;</xsl:when>
<xsl:when test="starts-with($afterAmp, 'quot;')">"</xsl:when>
<xsl:when test="starts-with($afterAmp, 'apos;')">'</xsl:when>
</xsl:choose>
<xsl:call-template name="unescape">
<xsl:with-param name="text" select="substring-after($afterAmp, ';')" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

然后您必须将其输出反馈到另一个样式表中以执行您想要的实际转换。

关于xml - XSLT:如何使用 XSLT 1.0 和 XALAN 处理器转换部分转义的 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20127479/

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