¿Cómo obtener el valor del atributo de entidad no analizado de XSLT?
Pregunta
Tengo un problema con XSLT y la entidad no analizada en XML. Aquí hay un escenario ficticio. Primero obtuve un archivo XML llamado doc.xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE document [
<!ELEMENT document (employee)*>
<!ELEMENT employee (lastname, firstname)>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT firstname (#PCDATA)>
<!NOTATION FOO SYSTEM 'text/xml'>
<!ENTITY ATTACHMENT SYSTEM 'attach.xml' NDATA FOO>
<!ATTLIST employee
detail ENTITY #IMPLIED>
]>
<document>
<employee detail="ATTACHMENT">
<lastname>Bob</lastname>
<firstname>Kevin</firstname>
</employee>
</document>
En este archivo XML, uso una entidad no analizada (NDATA) para el atributo " detail " del elemento " empleado " ;. El attach.xml es:
<?xml version="1.0" encoding="UTF-8"?>
<name>Bob Kevin</name>
Entonces quiero usar XSLT para generar una salida junto con el adjunto .xml incrustado. Mi archivo XSLT se llama doc.xsl:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="document">
<Document>
<xsl:apply-templates select="employee"/>
</Document>
</xsl:template>
<xsl:template match="employee">
Employee is: <xsl:value-of select="@detail"/>
</xsl:template>
</xsl:stylesheet>
Finalmente, ejecuto usando Xalan 2.7.1:
java -jar xalan.jar -IN doc.xml -XSL doc.xsl -OUT docout.xml
El resultado es:
<?xml version="1.0" encoding="UTF-8"?>
<Document>
Employee is: ATTACHMENT
</Document>
Esto no es lo que quiero. Quiero que la salida se vea así:
<?xml version="1.0" encoding="UTF-8"?>
<Document>
Employee is: <name>Bob Kevin</name>
</Document>
¿Cómo debo reescribir el script XSLT para obtener el resultado correcto?
Solución
La solución en XSLT 2.0 :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="document">
<Document>
<xsl:apply-templates select="employee"/>
</Document>
</xsl:template>
<xsl:template match="employee">
Employee is: <xsl:value-of select=
"unparsed-text(unparsed-entity-uri(@detail))"/>
</xsl:template>
</xsl:stylesheet>
Tenga en cuenta lo siguiente:
El uso de las funciones XSLT
unparsed-text () y < code> unparsed-entity-uri () .El texto del archivo attach.xml se escapará en la salida . Si desea verlo sin escapes, use
" cdata-section- elementos "
atributo del< xsl: salida / > instrucción.
Otros consejos
Gracias, Dimitre Novatchev. Según su respuesta, obtuve mi resultado en XSLT 1.0. Para aquellos que puedan estar interesados, consulte http://www.xml.com/lpt/ a / 1243 para una discusión. Aquí está mi solución:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="document">
<Document>
<xsl:apply-templates select="employee"/>
</Document>
</xsl:template>
<xsl:template match="employee">
Employee is: <xsl:copy-of select="document(unparsed-entity-uri(@detail))"/>
</xsl:template>
</xsl:stylesheet>
Tenga en cuenta la siguiente línea desde arriba:
<xsl:copy-of select="document(unparsed-entity-uri(@detail))"/>