首页 > 解决方案 > 根据子元素过滤记录

问题描述

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

标签: xslt

解决方案


试试这个模板

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

推荐阅读