根据其子元素过滤记录

时间:2018-07-09 06:32:32

标签: xslt

我需要用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>

2 个答案:

答案 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>

https://xsltfiddle.liberty-development.net/pPqsHTv