我有这个: rootrow fieldamp;lt;![CDATA[amp;lt;comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema"amp;gt; amp;lt;inicioCFDamp;gt; amp;lt;idArchivoamp;gt;182NAI053402amp;lt;/idArchivoamp;gt; amp;lt;etiquetaCFDamp;gt;NCRamp;lt;/etiqu
<root> <row> <field>&lt;![CDATA[&lt;comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema"&gt; &lt;inicioCFD&gt; &lt;idArchivo&gt;182NAI053402&lt;/idArchivo&gt; &lt;etiquetaCFD&gt;NCR&lt;/etiquetaCFD&gt; &lt;/inicioCFD&gt; &lt;/comprobante&gt;]]&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="'&~'"/> <xsl:with-param name="with" select="'<'"/> </xsl:call-template> </xsl:variable> <xsl:call-template name="replace-string"> <xsl:with-param name="text" select="$p4"/> <xsl:with-param name="replace" select="'&¬'"/> <xsl:with-param name="with" select="'>'"/> </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变量中读取任何内容.
但在那篇文章中,迪米特里说它可以用saxon:parse().好吧,我正在使用Xalan处理器,但我找不到类似的东西.我只能使用xalan和xslt 1.0.
有帮助吗?
提前致谢
这样的东西会从字段内部提取转义的内容,并将其作为纯文本输出(恰好是格式良好的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, '&')"> <xsl:value-of select="substring-before($text, '&')" /> <xsl:variable name="afterAmp" select="substring-after($text, '&')" /> <xsl:choose> <xsl:when test="starts-with($afterAmp, 'amp;')">&</xsl:when> <xsl:when test="starts-with($afterAmp, 'lt;')"><</xsl:when> <xsl:when test="starts-with($afterAmp, '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>
然后,您必须将此输出反馈到另一个样式表,以进行所需的实际转换.