2012-02-24 58 views

回答

6

使用processing-instruction()节点测试。

+1

Kirill,这个答案太笼统 - 你没有提供一个特定的XPath表达式来精确选择想要的PI。 – 2012-02-24 14:59:27

5

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

更具体地说,可以包括想要的PI节点的名称(目标)作为参数。

使用

/processing-instruction('xml-stylesheet') 

此选择具有名称xsl-stylesheet被在全局级别定义的任何处理指令(是所述顶部元件的兄弟姐妹)。

请注意,xsl:stylesheet是PI的无效PI目标。冒号':'用于从本地名称分隔名称空间前缀 - 但是处理指令目标不能属于名称空间。由于每W3c XPath Specification

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

此外,根据W3C文档:"Associating Style Sheets with XML documents 1.0”,则PI的一个样式表将XML文档相关联必须是目标:"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"?> 
+11

我看到你仍然在使用你的旧技巧......删除并重新发布一个放弃反对票的答案直接导致了滥用:人们如何决定评价你的答案是他们的决定,而不是你的答案。请不要再这样做。 – Shog9 2012-02-26 06:38:14

+0

'/ processing-instruction('xml-stylesheet')'选择名为'xsl-stylesheet'的东西吗?这将是神奇的!请注意'xml' vs'xsl'。 – 2013-05-28 09:53:36

+0

@MicheldeRuiter,是的,它的确如此。这是在这里正式定义的(底部第三段):http://www.w3.org/TR/xpath/#node-tests – 2013-05-28 14:01:52

0

甲处理指令帽两个部分目标和数据的语法:

<?target data?> 

如果您使用:

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

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

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

所以处理指令的字符串值是数据的一部分。选择表达式<xsl:value-of进行评估,并将结果对象转换为字符串,如隐式调用string()函数。