1

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

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

试图创建一个使用 XSL 解析 XML 的站点地图。但是,我需要从显示中排除几个目录,并且真的不想用长管道混淆语法| 测试声明....

<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/*)) )"
4

1 回答 1

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不匹配任何前缀,则为真。

请注意,因为您需要先将 RTF 转换为节点集,然后才提取其子节点,因此/*超出了范围exsl:node-set(...)- 您无法在 XSLT 1.0 中直接从 RTF 导航。

于 2013-05-02T16:20:34.117 回答