【问题标题】:XSLT filter out element with multiple conditionsXSLT 过滤掉具有多个条件的元素
【发布时间】:2017-03-09 19:57:04
【问题描述】:

我有一个很大的 XML 文件,我想根据多个条件过滤掉指定的元素,具体来说:

<title> contains 'K17' AND <category> contains 'APPLE'

所以我从这样的事情开始:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:g="http://base.google.com/ns/1.0">
 <xsl:output omit-xml-declaration="no" indent="yes" method="xml"/>

 <xsl:template match="node() | @*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="item[not(title/contains(text(),'K17')) and not(category/contains(text(),'APPLE'))]" />

</xsl:stylesheet>

测试 XML:

<channel>
    <item>
        <title>K170001 Test 1</title>
        <category><![CDATA[APPLE &gt; MOBILE &gt; IPHONE]]></category>
    </item>
    <item>
        <title>K170002 Test 2</title>
        <category><![CDATA[APPLE &gt; MOBILE &gt; IPHONE]]></category>
    </item>
    <item>
        <title>K1x70003 Test 3</title>
        <category><![CDATA[APPLE &gt; MOBILE &gt; IPHONE]]></category>
    </item>
    <item>
        <title>K170004 Test 4</title>
        <category><![CDATA[APxPLE &gt; MOBILE &gt; IPHONE]]></category>
    </item>
</channel>

最后两个元素不应出现在最终的 XML 中,因为 'K1x70003' 和 'APxPLE'。

这就是我的 XSLT 失败的地方,看起来 AND 运算符就像一个 OR 运算符。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    你当前的表达式有错误的逻辑......当你想要“not(X and Y)”时,“not(X) and not(Y)”与“not(X or Y)”相同(即与“非(X)或非(Y)”相同)

    试试这个(注意text()在这里不是真的需要)

    <xsl:template match="item[not(contains(title,'K17') and contains(category,'APPLE'))]" />
    

    或者只是这个....

    <xsl:template match="item[not(contains(title,'K17')) or not(contains(category,'APPLE'))]" />
    

    请注意语法 title/contains(text(),'K17')) 应该只在 XSLT 2.0 中有效。

    【讨论】:

      猜你喜欢
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      相关资源
      最近更新 更多