¿Cómo dividir el documento por ID de campos?
Frecuentes
Visto 170 veces
1
Dígame cómo dividir el documento por ID de campos. Por ejemplo, el número de documento se guarda en línea [@id=0]/field[@id=1]
y line[@id=0]/field[@id=2]
en line[@id>0]
son códigos y valores guardados.
Ejemplo XML:
<document>
<sheet id="0" name="Sheet1">
<line id="0">
<field id="0"><![CDATA[Code]]></field>
<field id="1"><![CDATA[01]]></field>
<field id="2"><![CDATA[02]]></field>
</line>
<line id="1">
<field id="0"><![CDATA[9772]]></field>
<field id="1"><![CDATA[9.0]]></field>
<field id="2"><![CDATA[5.0]]></field>
</line>
<line id="5">
<field id="0"><![CDATA[9771]]></field>
<field id="1"><![CDATA[1.0]]></field>
<field id="2"/>
</line>
<line id="1">
<field id="0"><![CDATA[9773]]></field>
<field id="1"><![CDATA[8.0]]></field>
<field id="2"><![CDATA[4.0]]></field>
</line>
</sheet>
</document>
si es necesario resultado:
<documents>
<document>
<header>
<number>01</number>
</heder>
<line>
<line-item>
<lineNumber>1</lineNumber>
<Code>9772</Code>
<value>9.0</value>
</line-item>
<line-item>
<lineNumber>2</lineNumber>
<Code>9771</Code>
<value>1.0</value>
</line-item>
<line-item>
<lineNumber>3</lineNumber>
<Code>9773</Code>
<value>8.0</value>
</line-item>
</line>
</document>
<document>
<header>
<number>02</number>
</heder>
<line>
<line-item>
<lineNumber>1</lineNumber>
<Code>9772</Code>
<value>5.0</value>
</line-item>
<line-item>
<lineNumber>2</lineNumber>
<Code>9773</Code>
<value>4.0</value>
</line-item>
</line>
</document>
</documents>
La transformación debería funcionar en xsl:stylesheet version="1.0"
1 Respuestas
1
Prueba esto ...
Solución 1: procedimental
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*" />
<xsl:template match="/">
<documents>
<xsl:apply-templates select="document/sheet/line[@id='0']/field[@id!='0']" />
</documents>
</xsl:template>
<xsl:template match="field[@id!='0']">
<document>
<header>
<number><xsl:value-of select="." /></number>
</header>
<line>
<xsl:call-template name="line-item-template" >
<xsl:with-param name="value-id" select="@id" />
<xsl:with-param name="lines" select="../../line[@id!='0']"/>
</xsl:call-template>
</line>
</document>
</xsl:template>
<xsl:template name="line-item-template">
<xsl:param name="value-id" />
<xsl:param name="lines" />
<xsl:for-each select="$lines[field[@id=$value-id]!='']" >
<line-item>
<lineNumber><xsl:value-of select="format-number(position(),'00')" /></lineNumber>
<Code><xsl:value-of select="field[@id='0']" /></Code>
<value><xsl:value-of select="field[@id=$value-id]" /></value>
</line-item>
</xsl:for-each >
</xsl:template>
</xsl:stylesheet>
.. o prueba esto...
Solución 2: Template-o-phile
Esta solución se conecta al nodo que se relaciona con el nodo de salida.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*" />
<xsl:template match="/">
<documents>
<xsl:apply-templates select="document/sheet/line[@id='0']/field[@id!='0']" />
</documents>
</xsl:template>
<xsl:template match="field[parent::line[@id='0']][@id!='0']">
<document>
<header>
<number><xsl:value-of select="." /></number>
</header>
<line>
<xsl:variable name="value-index" select="@id" />
<xsl:apply-templates select="../../line[@id!='0']/field[@id=$value-index]" />
</line>
</document>
</xsl:template>
<xsl:template match="field[parent::line[@id!='0']][.!='']">
<xsl:variable name="current" select="." />
<xsl:variable name="value-index" select="@id" />
<line-item>
<lineNumber><xsl:value-of select="format-number( count(
preceding::line[field[@id=$value-index]!='']
[..=$current/../..]
),'00')" /></lineNumber>
<Code><xsl:value-of select="../field[@id='0']" /></Code>
<value><xsl:value-of select="." /></value>
</line-item>
</xsl:template>
</xsl:stylesheet>
Ahora imagine resolver este problema para XSLT 2.0. ¡Ahora eso podría ser divertido! :-)
Respondido el 12 de junio de 12 a las 17:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas xslt or haz tu propia pregunta.
¿Qué has intentado hasta ahora? ¿Podría incluir la hoja de estilo que tiene en este momento y el resultado que da en la pregunta? - legoscia