我正在 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:line
、info:column
- 现在,当您处理此增强 XML 文件时,您可以使用
@info:line
等获取此信息。
- 使用 C# 中的 XmlReader 之类的工具处理文件,它知道行,只需将行号放在每个元素的属性中,例如
- 在 XSLT 3.0 中,通过
xsl:try
和xsl:catch
,处理器可能会发出有关上下文节点位置的信息,请检查您的处理器以获取信息。 - 如果您不介意使用特定于处理器的扩展,则可以使用
saxon:line-number
和saxon:column-number
与 Saxon,但这显然取决于您如何加载文档,无论此类信息是否可用。此外,这些功能仅适用于 Saxon 的商业版本,不适用于开源“家庭版”。
由于属性没有顺序,命名空间也没有,因此您不应尝试获取它们的物理位置。
关于xml - XSLT 访问目标元素源文件中的行和列位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32522081/