Фильтровать список XPath на основе значений в связанном списке - PullRequest
6 голосов
/ 11 ноября 2011

Учитывая этот XML

<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>

Я хочу написать запрос Xpath, который выберет Diags, если описание соответствующего ICD содержит немного текста.

Так, например, если я указал текст "st", я должен получить Diags "1" и "4". Если я укажу текст «ir», я получу «1», «3» и «4».

Я пытался

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

и вариации.

Я не смог заставить его работать. Кажется, ему не нравится вложенная ссылка на @icd.

Возможно ли это?

спасибо бен

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011
* +1000 * Используйте
   /*/DiagList
         /*
          [@icd
          =
           /*/ICDList/*
                [contains(@description, $pText)]
                   /@id
          ]

, где $pText должен быть заменен желаемым строковым литералом.

Проверка на основе XSLT :

<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>

когда это преобразование применяется к предоставленному документу XML (исправлено, чтобы оно было правильно сформировано):

<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>

требуемые узлы выбираются и копируются в вывод :

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

когда мы установим в приведенном выше преобразовании :

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

, затем снова получается желаемый результат:

<Diag id="1" icd="400" />
<Diag id="4" icd="400" />
0 голосов
/ 11 ноября 2011

Чего вам не хватает, так это концепции current(). Эта функция ссылается на узел контекста для всего выражения xpath, в отличие от ., который ссылается на текущий узел в выражении xpath.

Чтобы вы могли использовать:

/DiagList/Diag[contains(lcase(/ICDList/ICD[@id=current()/@icd]/@description), 'st')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...