Tengo que seleccionar solo registros únicos desde un documento XML, en el contexto de un bucle <xsl:for-each>
. Estoy limitado por Visual Studio para usar XSL 1.0.Seleccionar registros únicos en XSLT/XPath
<availList>
<item>
<schDate>2010-06-24</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>13:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-24</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>13:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-25</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>12:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-26</schDate>
<schFrmTime>13:00:00</schFrmTime>
<schToTime>14:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-26</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>12:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
</availList>
La singularidad debe basarse en el valor de los tres elementos secundarios: schDate
, schFrmTime
y schToTime
. Si dos elementos item
tienen los mismos valores para los tres elementos secundarios, son duplicados. En el XML anterior, los elementos uno y dos son duplicados. El resto es único. Como se indicó anteriormente, cada elemento contiene otros elementos que no deseamos incluir en la comparación. 'Unicidad' debería ser un factor de esos tres elementos, y solo de ellos.
he tratado de lograr esto a través de lo siguiente:
availList/item[not(schDate = preceding:: schDate and schFrmTime = preceding:: schFrmTime and schToTime = preceding:: schToTime)]
La idea detrás de esto es para seleccionar registros en los que no hay ningún elemento que precede a la misma schDate
, schFrmTime
y schToTime
. Sin embargo, su salida es falta el último elemento. Esto se debe a que mi XPath excluye elementos en los que coinciden todos los valores del elemento secundario en el documento anterior completo. Ningún item
coincide con todos los elementos secundarios del último elemento, pero dado que el valor de cada elemento está presente individualmente en otro elemento, el último elemento queda excluido.
que podría conseguir el resultado correcto comparando todos los valores del niño como una cadena concatenada a los mismos valores concatenados para cada elemento precedente. ¿Alguien sabe de una forma en que podría hacer esto?
Buena pregunta (+1). Vea mi respuesta para una solución XPath y XSLT. –
El método que usa la tecla() se conoce comúnmente como el método de Muenchian: http://www.jenitennison.com/xslt/grouping/muenchian.html –