我一直在寻找这个,但无法找到问题的解决方案。我正在尝试找到一个XPath表达式,它将选择具有名为“user”或“product”(或两者)的属性的所有元素。我知道一个属性的XPath表达式是:
//*[@user]
或
//*[@product]
这些都可以正常工作,它们会在文档中的任何位置使用适当的属性获取所有元素。但每当我尝试将它们组合起来时:
//*[@user|@product]
或
//*[@user]|//*[@product]
我只获得在找到这些属性的第一级中找到的元素。这是我的XML文档的一个示例:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet href="xslt.xml" type="application/xml"?>
<catalog>
<item user="me" product="coffee" />
<price product="expensive" quality="good">$19.50</price>
<item user="still me"><note product="poison">Do not eat.</note></item>
<price product="mystery"><exchange user="still me" product="euro" />$99.95</price>
</catalog>
现在进行XSLT转换:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//*[@user|@product]">
<xsl:copy />
</xsl:template>
</xsl:stylesheet>
我只获得这些元素:
<item/>
<price/>
<item/>
<price/>
但我真正想要的是:
<item/>
<price/>
<item/>
<note/>
<price/>
<exchange/>
当然,正如您可能已经猜到的那样,当我将“user”属性放在我的catalog元素中时,所有选择的都是catalog元素,没有子元素。
我已经尝试了几个小时但找不到解决方案。如果有人知道如何解决这个问题,请告诉我。
答案 0 :(得分:3)
使用or
代替|
。 |
是一个不同的运算符,我坦率地不知道它的含义: - )
答案 1 :(得分:2)
虽然JiříKantor提供的答案是正确的,但您必须使用以下XSLT才能获得所需的结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="//*[@user or @product]"/>
</xsl:template>
<xsl:template match="*">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>