<my-courses>
<courses-reqd>
<details>
<subject>Math</subject>
</details>
<details>
<subject>Econ</subject>
</details>
<details>
<subject>Geog</subject>
</details>
<details>
<subject>Phys</subject>
</details>
<detail>
<subject>Zool</subject>
</details>
</courses-reqd>
<courses-taken>
<details>
<subject>Math</subject>
</details>
<details>
<subject>Econ</subject>
</details>
<detail>
<subject>Zool</subject>
</details>
</courses-taken>
我提供了示例XML,并希望知道如何获取不在课程中的值,而是使用XPATH获取课程中的值。在提供的案例中,答案将是Geog和Phys,因为它们在课程中不存在。
<xsl:apply-templates select="my-courses\courses-reqd | not(my-courses\courses-taken)"/>
这是否可行,如果是这样,我将如何做到这一点。任何帮助,将不胜感激。
由于
答案 0 :(得分:0)
这里的简单答案就是这样做:
<xsl:apply-templates
select="/my-courses/courses-reqd/detail
[not(subject = /my-courses/courses/taken/details/subject)]" />
更好(更有效)的方法是使用密钥。
这将添加到XSLT的顶部:
<xsl:key name="kTaken" match="courses-taken//subject" use="."/>
然后,这将在您的一个模板中使用:
<xsl:apply-templates
select="/my-courses/courses-reqd/detail[not(key('kTaken', subject))]" />
在您的样本输入上运行此XSLT时(在更正样本输入后,始终使用名为“details”而非“detail”的元素:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="kTaken" match="courses-taken//subject" use="."/>
<xsl:template match="/">
<root>
<xsl:apply-templates
select="/my-courses/courses-reqd/details[not(key('kTaken', subject))]" />
</root>
</xsl:template>
<xsl:template match="details">
<course>
<xsl:value-of select="subject"/>
</course>
</xsl:template>
</xsl:stylesheet>
结果是:
<root>
<course>Geog</course>
<course>Phys</course>
</root>