选择Processing指令的XPath表达式是什么?

时间:2012-02-24 07:22:14

标签: xml xslt xpath

我在XML中使用xsl:stylesheet处理指令。无论如何使用XPath选择此PI?如果是这样的话?

3 个答案:

答案 0 :(得分:7)

使用processing-instruction() node-test。

答案 1 :(得分:5)

通常,可以使用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""xsl-stylesheet"

以下是完整示例

<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"?>

答案 2 :(得分:0)

处理指令包括两部分目标和数据,语法为:

<?target data?>

如果您使用:

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

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

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

因此处理指令的字符串值是数据部分。评估select <xsl:value-of的表达式,并将结果对象转换为字符串,就像对string()函数的隐式调用一样。