【问题标题】:xslt & xpath: match directly preceding commentsxslt & xpath:直接匹配前面的注释
【发布时间】:2010-06-07 16:10:11
【问题描述】:

我正在尝试对一批 XML 文档应用 XSLT 转换。转换的要点是重新排序几个元素。我希望保留 直接 在元素之前的所有 cmets:

<!-- not this comment -->
<element />

<!-- this comment -->
<!-- and this one -->
<element />

我最接近的解决方案是使用以下表达式:

<xsl:template match="element">
    <xsl:copy-of select="preceding-sibling::comment()"/>
</xsl:template>

它抓取了太多的 cmets:

<!-- not this comment -->
<!-- this comment -->
<!-- and this one -->

我理解为什么前面提到的 XPath 不能正常工作,但我对如何继续没有任何好的想法。我正在寻找的是选择所有前面的 cmets,其后续兄弟是另一个注释或正在处理的当前元素:

preceding-sibling::comment()[following-sibling::reference_to_current_element() or following-sibling::comment()]

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:
    <xsl:template match="element">
      <xsl:copy-of select="preceding-sibling::comment()[
        generate-id(following-sibling::*[1]) = generate-id(current())
      ]"/>
    </xsl:template>
    

    更高效:

    <xsl:key 
      name  = "kPrecedingComment" 
      match = "comment()" 
      use   = "generate-id(following-sibling::*[1])" 
    />
    
    <!-- ... -->
    
    <xsl:template match="element">
      <xsl:copy-of select="key('kPrecedingComment', generate-id())" />
    </xsl:template>
    

    【讨论】:

    • 谢谢,您的解决方案完美运行!我必须阅读一下 generate-id() 和 key()。
    • @Joshua Johnson:关于键:我已经写了一些东西来解释它们在 JavaScript 示例中的工作方式,如果你想看看:stackoverflow.com/questions/948218/…(只需阅读下面的部分回答)。
    【解决方案2】:

    我认为最好的表达方式如下:

    我想要预测的 cmets,但只有那些将当前节点作为第一个元素的 cmets 跟随它们。

    然后,在xpath1.0/xslt1.0:

    <xsl:template match="element">
    <xsl:copy-of select="preceding-sibling::comment()[count(following-sibling::*[1]|current()) = 1]"/>
    </xsl:template>
    

    【讨论】:

    • @Tomalak:你是对的。对不起!节点集中的每个节点都是不同的(节点集中没有重复的“节点引用”)。因此,要检查两个节点是否实际上是同一个节点,您不需要 generate-id() 函数(保证一个节点的唯一 id 字符串进入相同的转换过程)。您只需要检查联合是否生成具有一个节点的节点集。这是 de identity 节点集表达式的简化:“count($a | $b) = count($b) and count($b) = count($a)”。抱歉翻译,我的语言是西班牙语。
    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2013-05-23
    • 2021-09-02
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多