如何在XSLT中读取XML文件xml-stylesheet处理指令的href属性
XSLT读取xml-stylesheet处理指令属性的实现方法
完全可以读取,XSLT原生支持访问XML文档中的处理指令节点,具体实现方式如下:
核心逻辑说明
处理指令不属于XML元素节点,其内容是纯文本格式,无法直接通过@属性名的方式读取属性,需要先获取处理指令的文本内容,再做字符串解析提取href的值。
具体实现步骤
1. 获取xml-stylesheet处理指令内容
通过XPath的processing-instruction()轴直接获取根级别下的xml-stylesheet处理指令:
<xsl:variable name="stylesheet_pi" select="/processing-instruction('xml-stylesheet')" />
获取到的变量值就是类似type="text/xsl" href="recibo.xsl"的纯文本内容。
2. 提取href属性值
根据你使用的XSLT版本选择对应的解析方式:
XSLT 2.0及以上版本(推荐,正则匹配更便捷)
<!-- 提取双引号包裹的href值 --> <xsl:variable name="href_val" select="replace($stylesheet_pi, '.*href="([^"]+)".*', '$1')" />
XSLT 1.0版本(字符串截取实现)
<xsl:variable name="href_start" select="substring-after($stylesheet_pi, 'href="')" /> <xsl:variable name="href_val" select="substring-before($href_start, '"')" />
3. 判断发票类型
直接判断提取到的href_val值即可区分发票类型:
<xsl:choose> <xsl:when test="$href_val = 'recibo.xsl'"> <!-- recibo类型发票的处理逻辑 --> </xsl:when> <xsl:when test="$href_val = '其他xsl文件名'"> <!-- 其他类型发票的处理逻辑 --> </xsl:when> <xsl:otherwise> <!-- 未匹配到对应类型的处理逻辑 --> </xsl:otherwise> </xsl:choose>
注意事项
- 处理指令和XML根元素平级,必须从根路径
/下查找,不要在根元素的子节点路径下检索 - 如果存在多个xml-stylesheet处理指令,可以通过下标获取指定位置的指令,例如
/processing-instruction('xml-stylesheet')[1]获取第一个处理指令 - 如果你的业务场景中href值用单引号包裹,把上面代码里的
"替换为'即可
内容的提问来源于stack exchange,提问作者EvilInfestor
相关产品推荐
相关产品推荐

