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

标签 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 来做到这一点?

最佳答案

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 的商业版本,不适用于开源“家庭版”。

由于属性没有顺序,命名空间也没有,因此您不应尝试获取它们的物理位置。

关于xml - XSLT 访问目标元素源文件中的行和列位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32522081/

相关文章:

javascript - 将javascript变量放入xsl属性

c# - XPath 所有后代,即使是嵌套的 - 但不是父级的后代

javascript - 如何在网页上找到这个元素?

java - 使用xpath和vtd-xml获取元素的子节点和文本作为字符串

java - 如何以编程方式在 ActionBar 工具栏中创建过滤器图标

xslt - 如何使用 xsl-fo 翻译数据内的 <b> 标签

xpath - 在 XPATH 中是否可以通过属性值而不是名称来查找元素?

c++ - tinyxml。获取节点的全文(或 "raw content")?

java - 无法启动 Activity ComponentInfo : Error inflating class android. support.design.widget.CoordinatorLayout

html - 通用 xml -> 使用 xslt 和约定的 html 转换?