2011-11-10 18 views
6

Dato questo XMLFiltro lista XPath in base ai valori nella lista associata

<DiagList> 
    <Diag id="1" icd="400"/> 
    <Diag id="2" icd="401"/> 
    <Diag id="3" icd="402"/> 
    <Diag id="4" icd="400"/> 
</DiagList> 
<ICDList> 
    <ICD id="400" description="First one"/> 
    <ICD id="401" description="Second one"/> 
    <icd id="402" description="Third one"/> 
<ICDList> 

Voglio scrivere una query XPath che selezionerà Diags in cui la descrizione del ICD associato contiene del testo.

Quindi ad esempio se ho specificato il testo di "st", allora dovrei ottenere Diags "1" e "4". Se specifichi il testo di "ir" dovrei ottenere diags "1", "3" e "4".

Ho provato

/DiagList/Diag[contains(lcase(/ICDList/ICD[@id=/DiagList/Diag/@icd]/@description), 'st')] 

e variazioni.

Non sono riuscito a farlo funzionare. Sembra che non gli piaccia il riferimento annidato a @icd.

È qualcosa che è possibile?

grazie ben

+0

Hm. Cosa succede se hai scritto "uno"? Allora vorresti 1,2,3,4? – FailedDev

+0

Ottima domanda, +1. XPath ci dà la possibilità di scrivere un'espressione elegante, singola che seleziona i nodi desiderati. Non sono necessarie divertenti funzioni di estensione o solo funzioni XSLT. –

risposta

-1

Cosa vi manca è il concetto di current(). Questa funzione fa riferimento al nodo di contesto per l'intera espressione xpath, diversamente da ., che fa riferimento al nodo corrente all'interno dell'espressione xpath.

Così si potrebbe usare:

/DiagList/Diag[contains(lcase(/ICDList/ICD[@id=current()/@icd]/@description), 'st')] 
+0

@_Mike Sokolov: Questa è una domanda XPath, ma la tua risposta fornisce una soluzione solo XSLT ... –

+0

Grazie. Questo non ha funzionato nel mio ambiente (Altio front end).Potrei dover solo capire qualcos'altro sul back-end. –

2

Uso:

/*/DiagList 
     /* 
      [@icd 
      = 
      /*/ICDList/* 
       [contains(@description, $pText)] 
        /@id 
      ] 

dove $pText deve essere sostituito con la stringa desiderata letterale.

XSLT - basata verifica:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my "> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:param name="pText" select="'ir'"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/DiagList 
     /* 
      [@icd 
      = 
      /*/ICDList/* 
       [contains(@description, $pText)] 
        /@id 
      ]"/> 
</xsl:template> 
</xsl:stylesheet> 

quando questa trasformazione è applicato sul documento XML fornito (corretto da Mede ben formata):

<t> 
    <DiagList> 
     <Diag id="1" icd="400"/> 
     <Diag id="2" icd="401"/> 
     <Diag id="3" icd="402"/> 
     <Diag id="4" icd="400"/> 
    </DiagList> 
    <ICDList> 
     <ICD id="400" description="First one"/> 
     <ICD id="401" description="Second one"/> 
     <icd id="402" description="Third one"/> 
    </ICDList> 
</t> 

il voluto i nodi vengono selezionati e copiati nell'output:

<Diag id="1" icd="400" /> 
<Diag id="3" icd="402" /> 
<Diag id="4" icd="400" /> 

quando abbiamo impostato nella trasformazione sopra:

<xsl:param name="pText" select="'st'"/> 

poi di nuovo il risultato voluto è prodotto:

<Diag id="1" icd="400" /> 
<Diag id="4" icd="400" /> 
+0

Come faresti questo senza copia-di? E modello match? Come si possono stampare gli stessi valori in una singola riga usando una sola espressione xpath? – FailedDev

+0

@FailedDev: Sono un po 'confuso dalle tue domande: 1. Questa non è una domanda XSLT, ma le domande nel tuo commento riguardano XSLT. 2. Perché stai chiedendo di stampare valori? La domanda riguarda * la selezione * dei nodi. 3. Perché solo su una sola riga? 4. Vuoi dire che il risultato dovrebbe essere su una singola riga, o l'espressione XPath dovrebbe essere su una singola riga? Se si riferisce all'espressione XPath, l'ho scritta su più righe solo per motivi di leggibilità - può essere facilmente scritta su una singola riga, se necessario. –

+0

La mia domanda è come avresti avuto lo stesso risultato, quando si utilizza un'altra utilità, ad es. jquery o php e utilizzare xpath per avere gli stessi valori che si stampano al risultato. – FailedDev

Problemi correlati