У меня есть это:XSLT: Как преобразовать частично экранированный XML с XSLT 1.0 и XALAN-процессором?
<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>
Empty значения являются причинами ed, потому что экранированный XML не является XML-сообщением, как сообщение XSLT: How to transform partially escaped XML?, поэтому я ничего не мог прочитать из своей переменной $ comprobante.
Но в этом сообщении Димитрий говорит, что можно использовать саксон: parse(). Ну, я использую процессор Xalan, но я не мог найти что-то подобное. Я ограничусь использованием xalan и xslt 1.0.
Любая помощь?
Заранее спасибо
Большое спасибо, но мне нужно получить выход с одной таблицей стилей. Является ли это возможным? – jechaviz
Только вызывая функцию расширения Java (по строкам saxon: parse()), которая анализирует лексический XML в дерево. Почему вы накладываете столько ограничений на решение? Почему вы все еще используете XSLT 1.0? –
Я интегрирую систему (не запрограммированную мной), которая использует только java-механизм по умолчанию xslt, который является Xalan. Он принимает любой xslt, но его нужно записать в xslt 1.0. Я хотел бы изменить систему, но я не могу, поэтому мне нужно реализовать две системы, используя xslt 1.0. – jechaviz