【问题标题】:XSLT access to line and column position in source file of target elementXSLT 访问目标元素源文件中的行和列位置
【发布时间】:2015-09-11 11:11:54
【问题描述】:

我正在 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 做到这一点?

【问题讨论】:

  • 不确定“列”和“行”是什么意思。你能给我们展示一个输入和相应输出的例子吗?

标签: xml xslt xpath xml-parsing


【解决方案1】:

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

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

【讨论】:

  • 谢谢,saxon:line-number 正是我想要的!我不介意它是特定于撒克逊的,因为这仅用于调试目的。
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
相关资源
最近更新 更多