我的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排列和组合但没有成功。
我在这里做错了什么?
答案 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 = '')]" />