我需要用empinfo.class ='S'
过滤记录,并用其他任何empinfo.class
排除记录(完整的记录及其子对象应排除在外)。
我使用的XSLT代码还向我返回了一个包含一个empinfo.class='S'
而另一个empinfo.class
的记录(不期望)
输入xml:
<Root>
<Record>
<emp>
<empid>1</empid>
...
<empInfo>
<class>S</class>
...
</empInfo>
<empInfo>
<class>G</class>
...
</empInfo>
<empInfo>
<class>G</class>
...
</empInfo>
</emp>
</Record>
<Record>
<emp>
<empid>2</empid>
...
<empInfo>
<class>S</class>
...
</empInfo>
<empInfo>
<class>G</class>
...
</empInfo>
</emp>
</Record>
<Record>
<emp>
<empid>3</empid>
...
<empInfo>
<class>S</class>
...
</empInfo>
</emp>
</Record>
</Root>
XSLT代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Root">
<xsl:copy>
<xsl:copy-of select="Record[emp/empInfo/class='G'
and emp/empInfo/class ='S']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
预期的输出xml:
<Root>
<Record>
<emp>
<empid>3</empid>
...
<empInfo>
<class>S</class>
...
</empInfo>
</emp>
</Record>
</Root>
答案 0 :(得分:0)
尝试此模板
<xsl:template match="Root">
<xsl:copy>
<xsl:for-each select="Record/emp">
<xsl:if test="count(empInfo[class != 'S']) = 0">
<Record>
<xsl:copy-of select="." />
</Record>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
输出
<Root>
<Record>
<emp>
<empid>3</empid>
<empInfo>
<class>S</class>
</empInfo>
</emp>
</Record>
</Root>
答案 1 :(得分:0)
要选择所有Record
个与emp/empInfo/class
不同的S
后代的元素,可以使用谓词Record[not(emp/empInfo/class != 'S')]
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="Root">
<xsl:copy>
<xsl:copy-of select="Record[not(emp/empInfo/class != 'S')]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>