2011-11-18 63 views
3

我试图在某些任意元素或属性中使用我的计算机的主机名生成XML文件,例如阅读使用Saxon的XSLT样式表中的环境变量

<hostname>myHostname</hostname> 

我正在使用Saxon 9.2。我能想到的三种方式来做到这一点:

  1. 阅读和分析/etc/sysconfig/network(我使用的Fedora)
  2. 阅读环境变量(如$ echo $HOSTNAME
  3. 传递主机名撒克逊然后用以某种方式取消引用变量(不知道这是可能的)

这些可能吗?我认为第一种选择最有可能发挥作用,但我认为其他两种选择将产生较少的XSLT。

我也有一个相关的问题:

目前,我有一个生成一堆的XML文件的XSLT和源XML文件,它就像我希望它。无论如何,我可以选择为每个主机生成一个文件吗?也就是说,我想说'如果主机名是myHostName,那么为myHostName生成XML文件,如果主机名是myOtherHostName,然后生成myOtherHostName的XML文件'。

我问这是因为我试图配置大量的机器,如果我可以在每个机器上放置一个XSLT和XML文件,然后在每台机器上调用相同的命令并获取正确的XML,真的很有信心。

+1

dimitre说(下面),使我对... 他正在将问题分成几个阶段,使用内置逻辑来处理文件系统和转换。 – Mike

回答

2

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

在样式表的顶部,你会碰到这样的

所以:

<xsl:param name="hostName"/> 

然后你就可以在你的.xslt通过常用的符号使用它:$hostName

你就在这时,需要调用xslt处理器时传递这些参数。取决于你如何使用它可能会有所不同。

+0

如果我想传递多个参数,它是如何工作的?仅供参考:'saxon -h'给了我这个'param = value设置样式表字符串参数'这非常简单。 – devin

+1

@devin - 不止一个参数意味着在样式表中更多的'xsl:param'和更多的'param = value'在命令行上。 –

2

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

这里是一个链接,可以帮助http://www.saxonica.com/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())。