排除基于节点列表的匹配

时间:2013-05-02 16:04:46

标签: xml xslt xslt-1.0

这里的第一个问题请耐心等待......

我通过我的CMS仅限于XSLT 1.0: - /

尝试使用XSL创建解析XML的SiteMap。但是,我需要从显示中排除几个目录,并且实际上不希望用长管道来混淆语法测试声明......

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl">

**<!-- HAVE ALSO TRIED THIS AS A PARAM -->**
<xsl:variable name="pPaths">
    <n>/docs</n>
    <n>/files</n>
</xsl:variable>

<xsl:if test="not( starts-with(path, $pPaths) )">  
    <url>
        <loc>http://www.domain.com<xsl:value-of select="path"/></loc>
        <changefreq>monthly</changefreq>
    </url>
</xsl:if>

在上面的代码中,如果只有1'n'元素,则它会被正确排除。但是,添加第二个“n”会阻止它完全正常工作。

我还尝试了没有运气

这些其他变体
test="not( starts-with(path, $pPaths/*) )"
test="not( starts-with(path, exsl:node-list($pPaths)) )"
test="not( starts-with(path, exsl:node-list($pPaths/*)) )"

1 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

<xsl:if test="not(exsl:node-set($pPaths)/*[starts-with(current()/path, .)])">
  • $pPaths是一个包含带有两个子元素节点的结果树片段的变量。
  • exsl:node-set($pPaths)是一个包含一个节点(文档片段)的节点集,该节点有两个子元素。
  • exsl:node-set($pPaths)/*是一个包含两个节点(这两个子元素)的节点集。
  • exsl:node-set($pPaths)/*[starts-with(current()/path, .)]是一个节点集,它将包含零个,一个或两个节点(那些n个元素,其文本内容是当前元素的第一个path子节点的前缀)
  • 最后,如果该节点集为空,则not(...)为真,即当前path与任何前缀都不匹配。

请注意,/* 在<{em>外面 exsl:node-set(...),因为您需要先将RTF转换为节点集,然后才能提取其子节点 - 您无法导航直接在XSLT 1.0中从RTF。