XSL:当和xsl:否则无法按预期工作

时间:2014-08-13 22:13:32

标签: xml xslt

我的XML如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Rowsets CachedTime="" DateCreated="2014-08-08T05:23:47" EndDate="2014-08-08T05:23:45" StartDate="2014-08-08T04:23:45" Version="14.0.0 Build(802)">
    <Rowset>
        <Row>
            <Name>MAKTX</Name>
            <Value>Ethanol</Value>
            <Min>4</Min>
            <Max>4</Max>
        </Row>
        <Row>
            <Name>SEQNR</Name>
            <Value>T10</Value>
            <Min>5</Min>
            <Max>15</Max>
        </Row>
        <Row>
            <Name>QNT</Name>
            <Value>10</Value>
            <Min>0</Min>
            <Max>10000000000000</Max>
        </Row>
    </Rowset>
    <Rowset>
        <Row>
            <Name>MAKTX</Name>
            <Value>CO2</Value>
            <Min>4</Min>
            <Max>4</Max>
        </Row>
        <Row>
            <Name>SEQNR</Name>
            <Value>T8</Value>
            <Min>5</Min>
            <Max>15</Max>
        </Row>
        <Row>
            <Name>QNT</Name>
            <Value/>
            <Min>0</Min>
            <Max>10000000000000</Max>
        </Row>
    </Rowset>
    <Rowset>
        <Row>
            <Name>MAKTX</Name>
            <Value/>
            <Min>4</Min>
            <Max>4</Max>
        </Row>
        <Row>
            <Name>SEQNR</Name>
            <Value>-- Select One --</Value>
            <Min>5</Min>
            <Max>15</Max>
        </Row>
        <Row>
            <Name>QNT</Name>
            <Value/>
            <Min>0</Min>
            <Max>10000000000000</Max>
        </Row>
    </Rowset>
</Rowsets>

我想要一个结果XML,其中只包含那些<Rowset> [Name='QNT']/Value = '' and [Name = 'MAKTX']/Value = ''

我的XSLT如下所示:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java" version="1.0">
    <xsl:output media-type="text/xml" method="xml"/>
    <!-- Filters refdoc based on condition and  data  -->
    <xsl:template match="/Rowsets">
        <Rowsets>
            <xsl:for-each select="/Rowsets/Rowset">
                <xsl:choose>
                    <xsl:when test="Rowset[Row[Name='QNT']/Value = '' and Row[Name = 'MAKTX']/Value = '']">
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:copy-of select="."/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
        </Rowsets>
    </xsl:template>
</xsl:stylesheet>

但是它给了我整个XML作为输出而不删除最后一个<Rowset>。我尝试了variosa排列和组合但没有成功。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

问题是上下文之一。您正在迭代Rowset元素,如此

 <xsl:for-each select="/Rowsets/Rowset">

这意味着在xsl:for-each范围内,您位于Rowset元素上,因此任何xpath表达式都与此相关。因此,当您执行<xsl:when test="Rowset[...时,它正在寻找Rowset当前Rowset的孩子。

你需要做的只是这个......

<xsl:when test="Row[Name='QNT']/Value = '' and Row[Name = 'MAKTX']/Value = ''">

事实上,你根本不需要xsl:choose。您可以将表达式作为xsl:for-each

的一部分
  <xsl:for-each select="Rowset[not(Row[Name='QNT']/Value = '' and Row[Name = 'MAKTX']/Value = '')]">
      <xsl:copy-of select="."/>
 </xsl:for-each>

话虽如此,你甚至不需要xsl:for-each。你可以这样做......

<xsl:copy-of select="Rowset[not(Row[Name='QNT']/Value = '' and Row[Name = 'MAKTX']/Value = '')]" />