【发布时间】:2012-02-24 07:22:13
【问题描述】:
我在我的 XML 中使用 xsl:stylesheet 处理指令。无论如何使用 XPath 选择这个 PI 吗?如果有怎么办?
【问题讨论】:
我在我的 XML 中使用 xsl:stylesheet 处理指令。无论如何使用 XPath 选择这个 PI 吗?如果有怎么办?
【问题讨论】:
使用processing-instruction() node-test。
【讨论】:
一般来说,可以使用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 的事物?那将是魔术!注意xml 与xsl。
processing-instruction()[name() = 'xml-stylesheet' or name()='xsl-stylesheet']
一个由目标和数据两部分组成的处理指令,语法如下:
<?target data?>
如果你使用:
<xsl:value-of select="/processing-instruction('xml-stylesheet')" />
它只会返回数据部分,在Dimitre Novatchev的例子中,它返回:
type="text/xsl" href="test"
所以处理指令的字符串值就是数据部分。 <xsl:value-of 的 select 表达式被求值,结果对象被转换为字符串,就像对 string() 函数的隐式调用一样。
【讨论】: