【问题标题】:Grabbing text between Processing Instructions in XSLT在 XSLT 中的处理指令之间抓取文本
【发布时间】:2020-03-24 18:09:53
【问题描述】:

我正在尝试在以下 XML 上运行 XSLT,以在某些 PI 之间用新元素包装文本:

输入 XML:

<doc>
   <p>
      <?addition?>hello<?addition?> text1
   </p>
   <p>text2</p>
   <p>
      <?addition?>bye<?addition?> text2
   </p>
</doc>

我正在尝试将addition-startaddition-end 之间的文本包装在&lt;u&gt; 元素中,如下所示。

期望的输出:

<doc>
   <p>
      <u>hello</u> text1
   </p>
   <p>text2</p>
   <p>
      <u>bye</u> text2
   </p>
</doc>

我当前的 XSLT 错误地抓取了不在 PI 和当前样式表之间的文本节点:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="#all"
    version="2.0">
    <xsl:template
        match="@* | node()">
        <xsl:copy
            copy-namespaces="no"
            exclude-result-prefixes="#all"
            inherit-namespaces="no">
            <xsl:apply-templates
                select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//p/text()[preceding::processing-instruction('addition')]
                                   [following::processing-instruction('addition')]">
        <u><xsl:value-of select="." /></u>
    </xsl:template>
</xsl:stylesheet>

有没有办法调整我的 XSLT 来实现这一点,并且只用 &lt;u&gt; 包装被 PI 包围的文本?

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    我想你想要

    <xsl:template match="p/text()[preceding-sibling::node()[1][self::processing-instruction('addition')]]
                                 [following-sibling::node()[1][self::processing-instruction('addition')]]">
        <u><xsl:value-of select="." /></u>
    </xsl:template>
    

    https://xsltfiddle.liberty-development.net/ehVZvvF

    而且,正如 Daniel Haley 在他的评论中指出的那样,您还可以添加一个空模板 &lt;xsl:template match="processing-instruction('addition')"/&gt; 以删除处理指令。

    https://xsltfiddle.liberty-development.net/ehVZvvF/1

    【讨论】:

    • @DanielHaley,很好,我已经在答案和示例中添加了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多