这里的第一个问题请耐心等待......
我通过我的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/*)) )"
答案 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。