【问题标题】:What is the XPath expression to select a Processing instruction?选择处理指令的 XPath 表达式是什么?
【发布时间】:2012-02-24 07:22:13
【问题描述】:

我在我的 XML 中使用 xsl:stylesheet 处理指令。无论如何使用 XPath 选择这个 PI 吗?如果有怎么办?

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    使用processing-instruction() node-test。

    【讨论】:

    • Kirill,这个答案太笼统了——你没有提供一个特定的 XPath 表达式来精确选择想要的 PI。
    【解决方案2】:

    一般来说,可以使用processing-instruction()节点测试来选择处理指令。

    更具体地说,可以将所需 PI 节点的名称(目标)作为参数。

    使用

    /processing-instruction('xml-stylesheet')
    

    这将选择在全局级别定义的名称为 xsl-stylesheet 的任何处理指令(与顶层元素同级)。

    请注意,xsl:stylesheet 是 PI 的无效 PI 目标。冒号':' 用于将命名空间前缀与本地名称分隔——但是处理指令target 不能属于命名空间。根据W3c XPath Specification

    "处理指令有一个扩展名:本地部分是处理指令的目标;命名空间 URI 为空。"

    同样根据 W3C 文档:"Associating Style Sheets with XML documents 1.0”,将样式表关联到 XML 文档的 PI 的目标必须是:"xml-stylesheet"——而不是 "xsl:stylesheet" 或 @987654331 @.

    这是一个完整的例子

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="/">
         <xsl:copy-of select="/processing-instruction('xml-stylesheet')"/>
     </xsl:template>
    </xsl:stylesheet>
    

    当此转换应用于以下 XML 文档时

    <?xml-stylesheet type="text/xsl" href="test"?>
    <Books>
        <Book name="MyBook" />
    </Books>
    

    计算 XPath 表达式并输出选定的 PI 节点

    <?xml-stylesheet type="text/xsl" href="test"?>
    

    【讨论】:

    • 我看到你仍然在使用你的老把戏......删除并重新发布答案以放弃反对票是直接的滥用:人们决定如何评价你的答案是他们的决定,不是你的。请不要再这样做了。
    • /processing-instruction('xml-stylesheet') 是否选择名称为 xsl-stylesheet 的事物?那将是魔术!注意xmlxsl
    • @MicheldeRuiter,是的,确实如此。这在这里正式定义(倒数第三段):w3.org/TR/xpath/#node-tests
    • @MicheldeRuiter,不,它没有。不知道为什么 Dimitre 不这么认为,但我已经对此进行了测试,但它不会匹配。
    • @MicheldeRuiter,Flynn1179 是对的——我没有看到名字的不同。但你可以轻松做到:processing-instruction()[name() = 'xml-stylesheet' or name()='xsl-stylesheet']
    【解决方案3】:

    一个由目标和数据两部分组成的处理指令,语法如下:

    <?target data?>
    

    如果你使用:

    <xsl:value-of select="/processing-instruction('xml-stylesheet')" />
    

    它只会返回数据部分,在Dimitre Novatchev的例子中,它返回:

    type="text/xsl" href="test"
    

    所以处理指令的字符串值就是数据部分。 &lt;xsl:value-of 的 select 表达式被求值,结果对象被转换为字符串,就像对 string() 函数的隐式调用一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2021-12-18
      • 2018-05-04
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      • 2018-01-05
      相关资源
      最近更新 更多