xsl validaciones transformar programacion hojas generar estilo ejemplos archivo xml xslt xslt-1.0

xml - validaciones - xsl ejemplos



unir y combinar en XSLT con nodos opcionales (2)

No ha explicado la lógica detrás de lo que intenta hacer, pero al observar el XSLT a partir de esta pregunta y las preguntas anteriores, está agrupando los elementos attrGroupMany[@name = ''temperatureInformation'']/row pero una concatenación de el ancestro pos junto con "temperaturaCódigo" y "temperatura".

Luego, para cada una de esas row distintas, parece que desea agregar todos los elementos <attrGroupMany name="temperatureStats"> . Tener una plantilla que coincida con este elemento no va a funcionar si dices que es opcional. En su lugar, tenga una plantilla que coincida con la row principal y utilícela para seleccionar todos los elementos secundarios de todos los elementos en las claves.

<xsl:template match="attrGroupMany[@name = ''temperatureInformation'']/row"> <xsl:copy> <xsl:apply-templates select="@*|node()[not(self::attrGroupMany[@name = ''temperatureStats''])]"/> <attrGroupMany name="temperatureStats"> <xsl:apply-templates select="key(''group'', concat(generate-id(ancestor::pos), ''|'', attr[@name = ''temperatureCode''], ''|'', attrQualMany[@name = ''temperature'']))/attrGroupMany[@name = ''temperatureStats'']/row"/> </attrGroupMany> </xsl:copy> </xsl:template>

Estoy asumiendo que todo el StatsCode es distinto aquí. Si podría duplicarse, y desea eliminar esos duplicados, debe decirlo en su pregunta.

Prueba este XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:key name="group" match="party/pos/attrGroupMany[@name = ''temperatureInformation'']/row" use="concat(generate-id(ancestor::pos), ''|'', attr[@name = ''temperatureCode''], ''|'', attrQualMany[@name = ''temperature''])"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="attrGroupMany[@name = ''temperatureInformation'']"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates select="row[generate-id() = generate-id(key(''group'', concat(generate-id(ancestor::pos), ''|'', attr[@name = ''temperatureCode''], ''|'', attrQualMany[@name = ''temperature'']))[1])]"/> </xsl:copy> </xsl:template> <xsl:template match="attrGroupMany[@name = ''temperatureInformation'']/row"> <xsl:copy> <xsl:apply-templates select="@*|node()[not(self::attrGroupMany[@name = ''temperatureStats''])]"/> <attrGroupMany name="temperatureStats"> <xsl:apply-templates select="key(''group'', concat(generate-id(ancestor::pos), ''|'', attr[@name = ''temperatureCode''], ''|'', attrQualMany[@name = ''temperature'']))/attrGroupMany[@name = ''temperatureStats'']/row"/> </attrGroupMany> </xsl:copy> </xsl:template> </xsl:stylesheet>

Tengo un mensaje XML de muestra que contiene un nodo padre múltiple. El requisito es si los dos nodos principales son iguales, fusionar el nodo secundario. Esto funciona bien cuando todos los nodos están presentes pero no funciona cuando el nodo opcional está ausente

Mensaje de muestra: 1 con nodos opcionales presentes

<document> <body> <party> <gtin>1000909090</gtin> <pos> <attrGroupMany name="temperatureInformation"> <row> <gtin>1000909090</gtin> <attr name="temperatureCode">STORAGE</attr> <attrQualMany name="temperature"> <value qual="FAH">10</value> <value qual="CC">20</value> </attrQualMany> <attrGroupMany name="temperatureStats"> <!-- optional group --> <row> <attr name="StatsCode">CODE1</attr> </row> <row> <attr name="StatsCode">CODE2</attr> </row> </attrGroupMany> </row> <row> <attr name="temperatureCode">STORAGE</attr> <attrQualMany name="temperature"> <value qual="FAH">10</value> <value qual="CC">20</value> </attrQualMany> <attrGroupMany name="temperatureStats"> <!-- optional group --> <row> <attr name="StatsCode">CODE3</attr> </row> <row> <attr name="StatsCode">CODE4</attr> </row> </attrGroupMany> </row> <row> <attr name="temperatureCode">HANDLING</attr> <attrQualMany name="temperature"> <value qual="FAH">10</value> </attrQualMany> <attrGroupMany name="temperatureStats"> <!-- optional group --> <row> <attr name="StatsCode">CODE5</attr> </row> <row> <attr name="StatsCode">CODE6</attr> </row> </attrGroupMany> </row> <row> <attr name="temperatureCode">HANDLING</attr> <attrGroupMany name="temperatureStats"> <!-- optional group --> <row> <attr name="StatsCode">CODE7</attr> </row> <row> <attr name="StatsCode">CODE8</attr> </row> </attrGroupMany> </row> </attrGroupMany> </pos> </party> </body> </document>

El siguiente ejemplo XSLT funciona bien para eliminar el duplicado de ''attrGroupMany name = "temperatureInformation"''

XSLT usado

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:key name="group" match="party/pos/attrGroupMany[@name = ''temperatureInformation'']/row" use="concat(generate-id(ancestor::pos), ''|'', attr[@name = ''temperatureCode''], ''|'', attrQualMany[@name = ''temperature''])"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="attrGroupMany[@name = ''temperatureInformation'']"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates select="row[generate-id() = generate-id(key(''group'', concat(generate-id(ancestor::pos), ''|'', attr[@name = ''temperatureCode''], ''|'', attrQualMany[@name = ''temperature'']))[1])]"/> </xsl:copy> </xsl:template> <xsl:template match="attrGroupMany[@name = ''temperatureStats'']"> <xsl:copy> <xsl:apply-templates select="@* | key(''group'', concat(generate-id(ancestor::pos), ''|'',../attr[@name = ''temperatureCode''], ''|'', ../attrQualMany[@name = ''temperature'']))/attrGroupMany[@name = ''temperatureStats'']/row"/> </xsl:copy> </xsl:template> </xsl:stylesheet>

El mensaje de muestra 2 que no funciona con el XSLT anterior es

<document> <body> <party> <gtin>1000909090</gtin> <pos> <attrGroupMany name="temperatureInformation"> <row> <gtin>1000909090</gtin> <attr name="temperatureCode">STORAGE</attr> <attrQualMany name="temperature"> <value qual="FAH">10</value> <value qual="CC">20</value> </attrQualMany> </row> <row> <attr name="temperatureCode">STORAGE</attr> <attrQualMany name="temperature"> <value qual="FAH">10</value> <value qual="CC">20</value> </attrQualMany> <attrGroupMany name="temperatureStats"> <!-- optional group --> <row> <attr name="StatsCode">CODE3</attr> </row> <row> <attr name="StatsCode">CODE4</attr> </row> </attrGroupMany> </row> <row> <attr name="temperatureCode">HANDLING</attr> <attrQualMany name="temperature"> <value qual="FAH">10</value> </attrQualMany> <attrGroupMany name="temperatureStats"> <!-- optional group --> <row> <attr name="StatsCode">CODE5</attr> </row> <row> <attr name="StatsCode">CODE6</attr> </row> </attrGroupMany> </row> <row> <attr name="temperatureCode">HANDLING</attr> <attrGroupMany name="temperatureStats"> <!-- optional group --> <row> <attr name="StatsCode">CODE7</attr> </row> <row> <attr name="StatsCode">CODE8</attr> </row> </attrGroupMany> </row> </attrGroupMany> </pos> </party> </body> </document>

¿Puede alguien decirme cómo manejar el nodo opcional en match n merge?

El resultado esperado para el mensaje de muestra 2 es

<?xml version="1.0" encoding="UTF-8"?> <document> <body> <party> <gtin>1000909090</gtin> <pos> <attrGroupMany name="temperatureInformation"> <row> <gtin>1000909090</gtin> <attr name="temperatureCode">STORAGE</attr> <attrQualMany name="temperature"> <value qual="FAH">10</value> <value qual="CC">20</value> </attrQualMany> <attrGroupMany name="temperatureStats"> <row> <attr name="StatsCode">CODE3</attr> </row> <row> <attr name="StatsCode">CODE4</attr> </row> </attrGroupMany> </row> <row> <attr name="temperatureCode">HANDLING</attr> <attrQualMany name="temperature"> <value qual="FAH">10</value> </attrQualMany> <attrGroupMany name="temperatureStats"> <row> <attr name="StatsCode">CODE5</attr> </row> <row> <attr name="StatsCode">CODE6</attr> </row> </attrGroupMany> </row> <row> <attr name="temperatureCode">HANDLING</attr> <attrGroupMany name="temperatureStats"> <row> <attr name="StatsCode">CODE7</attr> </row> <row> <attr name="StatsCode">CODE8</attr> </row> </attrGroupMany> </row> </attrGroupMany> </pos> </party> </body> </document>

¿Puede alguien decirme cómo manejar el nodo opcional en match n merge? Gracias


<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:key name="grouptemperatureInformation" match="party/pos/attrGroupMany[@name = ''temperatureInformation'']/row" use="concat(generate-id(ancestor::pos), ''|'', attr[@name = ''temperatureCode''], ''|'', attrQualMany[@name = ''temperature''])"/> <xsl:key name="grouptemperatureStats" match="party/pos/attrGroupMany[@name = ''temperatureInformation'']/row/attrGroupMany[@name = ''temperatureStats'']/row" use="concat(generate-id(ancestor::pos), ''|'', ../../../attr[@name = ''temperatureCode''], ''|'', ../../../attrQualMany[@name = ''temperature''], ''|'', attr[@name = ''StatsCode''])"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="attrGroupMany[@name = ''temperatureInformation'']"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates select="row[generate-id() = generate-id(key(''grouptemperatureInformation'', concat(generate-id(ancestor::pos), ''|'', attr[@name = ''temperatureCode''], ''|'', attrQualMany[@name = ''temperature'']))[1])]"/> </xsl:copy> </xsl:template> <xsl:template match="attrGroupMany[@name = ''temperatureInformation'']/row"> <xsl:variable name="group" select="key(''grouptemperatureInformation'', concat(generate-id(ancestor::pos), ''|'', attr[@name = ''temperatureCode''], ''|'', attrQualMany[@name = ''temperature'']))/attrGroupMany[@name=''temperatureStats'']/row" /> <xsl:copy> <xsl:apply-templates select="@*|node()[not(self::attrGroupMany[@name = ''temperatureStats''])]"/> <attrGroupMany name="temperatureStats"> <xsl:apply-templates select="@* | $group[generate-id() = generate-id(key(''grouptemperatureStats'', concat(generate-id(ancestor::pos), ''|'', ../../../attr[@name = ''temperatureCode''], ''|'', ../../../attrQualMany[@name = ''temperature''], ''|'', attr[@name = ''StatsCode'']))[1])]"/> </attrGroupMany> </xsl:copy> </xsl:template> </xsl:stylesheet>