根据关联列表中的值过滤XPath列表

时间:2011-11-10 22:52:07

标签: xpath

鉴于此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查询,它将选择相关ICD描述所包含的Diags 一些文字。

因此,例如,如果我指定了“st”的文本,那么我应该得到Diags“1”和“4”。如果我指定“ir”的文本,我应该得到diags“1”,“3”和“4”。

我试过

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

和变化。

我无法让它发挥作用。似乎它不喜欢对@icd的嵌套引用。

这是可能的吗?

感谢 本

2 个答案:

答案 0 :(得分:2)

使用

   /*/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" />

答案 1 :(得分:-1)

您缺少的是current()的概念。此函数引用整个xpath表达式的上下文节点,而不像引用xpath表达式中当前节点的.

所以你可以使用:

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