使用Saxon在XSLT样式表中读取环境变量

问题描述 投票:3回答:3

我正在尝试使用我的机器的主机名在某个任意元素或属性中生成一个XML文件,例如

<hostname>myHostname</hostname>

我正在使用Saxon 9.2。我可以想到三种方法:

  1. 阅读并解析/etc/sysconfig/network(我正在使用Fedora)
  2. 阅读环境变量(如$ echo $HOSTNAME
  3. 将主机名传递给saxon,然后以某种方式取消引用变量(不确定是否可行)

这些都有可能吗?我认为第一种选择最有可能起作用,但我认为其他两种选择会产生较少冗长的XSLT。

我也有一个相关的问题:

目前,我有一个XSLT和源XML文件,它生成一堆XML文件,它的工作方式与我期望的一样。无论如何我可以选择性地为每个主机生成一个文件吗?也就是说,我想说'如果主机名是myHostName,则为myHostName生成XML文件,如果主机名是myOtherHostName,则为myOtherHostName生成XML文件'。

我问这个是因为我正在尝试配置大量的机器,如果我可以在每个机器上删除一个XSLT和XML文件,然后在每台机器上调用相同的命令,并在每个机器上获得正确的XML,那将非常方便。

xslt saxon
3个回答
2
投票

您应该在“调用”它时将参数传递给xslt。我认为这是最强大的解决方案。

所以在样式表的顶部你会有类似的东西:

<xsl:param name="hostName"/>

然后你可以通过通常的表示法在你的.xslt中使用它:$hostName等。

然后,您需要在调用xslt处理器时传递这些参数。根据您的使用方式,这可能会有所不同。


2
投票

您可以生成包含所有所需参数的XML文件,然后您可以将其作为参数传递给转换(请参阅代码示例以查看使用Saxon如何完成此操作的示例)。

这是一个可以帮助的链接:https://www.saxonica.com/html/documentation/javadoc/net/sf/saxon/expr/instruct/GlobalParameterSet.html

或者更简单,将此XML文件保存在文件系统中,并将参数传递给转换文件路径和名称。

然后在转换中,使用标准的XSLT函数document()来加载包含参数的XML文档。

如果此文件可以存储在所有计算机上具有完全相同路径的位置,则甚至可以进一步简化。然后,这避免了将此文件路径作为参数传递给转换的需要。


1
投票

有许多可能的方法:传入参数,使用unparsed-text()函数读取配置文件,调用扩展函数。

但也许最直接的方式是Saxon 9.3实现了新的XPath 3.0功能get-environment-variable()。对XPath 3.0的支持需要Saxon-PE或更高版本。

(XPath 3.0当然还是一个草案,可能会有所改变。事实上,自Saxon 9.3发布以来它已经发生了变化 - 该功能已被重命名为environment-variable())。

© www.soinside.com 2019 - 2024. All rights reserved.