鉴于此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的嵌套引用。
这是可能的吗?
感谢 本
答案 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')]