xslt - tutorial - validaciones xsl
XSLT con origen XML que tiene un espacio de nombre predeterminado establecido en xmlns (3)
Tengo un documento XML con un espacio de nombre predeterminado indicado en la raíz. Algo como esto:
<MyRoot xmlns="http://www.mysite.com">
<MyChild1>
<MyData>1234</MyData>
</MyChild1>
</MyRoot>
El XSLT para analizar XML no funciona como se esperaba debido al espacio de nombres predeterminado, es decir, cuando elimino el espacio de nombres, todo funciona como se esperaba.
Aquí está mi XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/" >
<soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<NewRoot xmlns="http://wherever.com">
<NewChild>
<ChildID>ABCD</ChildID>
<ChildData>
<xsl:value-of select="/MyRoot/MyChild1/MyData"/>
</ChildData>
</NewChild>
</NewRoot>
</soap:Body>
</soap:Envelope>
</xsl:template>
</xsl:stylesheet>
¿Qué se debe hacer con el documento XSLT para que la traducción funcione correctamente? ¿Qué se debe hacer exactamente en el documento XSLT?
Debe declarar el espacio de nombres en su XSLT y usarlo en expresiones XPath. P.ej:
<xsl:stylesheet ... xmlns:my="http://www.mysite.com">
<xsl:template match="/my:MyRoot"> ... </xsl:template>
</xsl:stylesheet>
Tenga en cuenta que debe proporcionar algún prefijo si desea hacer referencia a los elementos de ese espacio de nombres en XPath. Si bien puede hacer xmlns="..."
sin el prefijo, y funcionará para elementos de resultado literales, no funcionará para XPath: en XPath, un nombre no prefijado siempre se considera en el espacio de nombres con URI en blanco, independientemente de cualquier xmlns="..."
en el alcance.
Si esto fue una especie de problema de espacio de nombre, hay espacio para intentar modificar dos cosas en el archivo xslt:
- agregue la definición de espacio de nombre "my" en la etiqueta xsl: stylesheet
- use el prefijo "my:" cuando los elementos de llamada atraviesan el archivo xml.
resultado
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/" >
<soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<NewRoot xmlns="http://wherever.com">
<NewChild>
<ChildID>ABCD</ChildID>
<ChildData>
<xsl:value-of select="/my:MyRoot/my:MyChild1/my:MyData"/>
</ChildData>
</NewChild>
</NewRoot>
</soap:Body>
</soap:Envelope>
</xsl:template>
</xsl:stylesheet>
Si usa XSLT 2.0, especifique xpath-default-namespace="http://www.example.com"
en la sección de stylesheet
.