如何从XML处理指令中提取值?求XSLT实现方法
看起来你卡在了XML处理指令(PI)的值提取上,我来帮你捋清楚问题所在以及正确的解决办法~
首先,你之前的尝试没成功的核心原因是没正确选择到处理指令节点。XML里的<?ConditionState 4?>属于处理指令,不是普通元素或文本节点,XPath需要用专门的processing-instruction()函数来定位它。
正确的XPath选择方式
要选择root元素下的ConditionState处理指令,你需要用:
processing-instruction('ConditionState')
这个函数会匹配名称为ConditionState的处理指令节点。
完整的XSLT示例
下面是能直接得到你想要结果的样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/root"> <root> <!-- 提取处理指令的内容,并用normalize-space去掉前后空格 --> <xsl:value-of select="normalize-space(processing-instruction('ConditionState'))"/> </root> </xsl:template> </xsl:stylesheet>
把这个样式表应用到你的输入XML上,输出就是<root>4</root>,完全符合你的需求。
为什么你之前的方法无效?
- 你写的
<xsl:value-of select="root[?ConditionState]">是错误的XPath语法,XPath没有用?来匹配处理指令的规则,必须用processing-instruction()函数。 - 你尝试的
substring-after(substring-before(/root,'?>'),'<?ConditionState ')无效,是因为/root是元素节点,直接对它调用字符串函数时,只会取元素内部的文本内容,而处理指令是root的子节点,不属于文本内容,所以根本取不到目标字符串。
如果你的XSLT版本是2.0及以上,还可以用tokenize来更精准地提取数字,但对于这个场景,XSLT 1.0的normalize-space已经足够好用啦。
内容的提问来源于stack exchange,提问作者NvrKill
相关产品推荐
相关产品推荐

