XSLT访问目标元素的源文件中的行和列位置

时间:2015-09-11 11:11:55

标签: xml xslt xpath xml-parsing

我在XSLT中寻找一个XPath表达式,它将给出输入XML文件中匹配元素所在位置的行号和列号。也许看起来像这样:

<xsl:template match="//foo">
  element foo is at line <xsl:value-of select="...?" /> column <xsl:value-of select="...?" /> of the input file
</xsl:template>

有没有办法用XSLT做到这一点?

1 个答案:

答案 0 :(得分:2)

XSLT中不存在这样的功能,因为XSLT和XPath使用XDM实例来表示XML文档,这会丢失此信息,实体名称或DTD信息。

这是有道理的,因为从XPath的角度来看,XML不是文件,而是根,元素,属性,子等的树结构。

以下是一些“修复”此问题的建议,例如,如果您要报告XML文件中的错误

  • 将绝对XPath作为字符串添加到任何上下文节点,在任何XPath测试器中复制/粘贴它都是微不足道的,它将直接指向要报告的节点,无论是否删除了空格或左边的行完好。
  • 您可以使用以下过程扩充文件:
    • 使用C#中的XmlReader处理文件,它知道该行,只需将行号放在每个元素的属性中,例如info:lineinfo:column
    • 现在,当您处理此扩充的XML文件时,您可以使用@info:line等获取此信息。
  • 在XSLT 3.0中,使用xsl:tryxsl:catch,处理器可以发出有关上下文节点位置的信息,请检查处理器以获取信息。
  • 如果您不介意使用特定于处理器的扩展程序,可以将saxon:line-numbersaxon:column-number与Saxon一起使用,但这显然取决于您加载文档的方式,无论此类信息是否可用。此外,这些功能仅适用于Saxon的商业版本,而不适用于开源“Home Edition”。

由于属性没有命令,命名空间也没有,你不应该试图获取那些命令的物理位置。