在xsltproc中设置QName参数

时间:2016-03-24 19:31:37

标签: xslt

我有一个XSLT模板,需要在名称为QNames的顶级参数中传递数据,类似于:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:eg="http://example.com/" version="1.0">
  <xsl:param name="eg:foo"/>
  <xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:value-of select="$eg:foo"/>
  </xsl:template>
</xsl:stylesheet>

我无法将参数重命名为外部标准定义的参数,我需要能够使用符合该标准的第三方模板。我更喜欢使用xsltproc来处理模板,因为我已经在项目中使用它,并且我熟悉它的特性。但是我无法解决如何从命令行设置QName参数的问题。我真正想要的是像

xsltproc --xmlns eg http://example.com/ --stringparam eg:foo Something \
    template.xsl input.xml

...应该回显eg:foo参数的值。 (input.xml的内容是无关紧要的,只要它格式良好的XML。)但是我找不到像我假设的--xmlns命令行选项那样的东西。任何人都可以建议我如何在不对template.xsl

中使用的特定前缀进行硬编码的情况下执行此操作

1 个答案:

答案 0 :(得分:1)

除了使用模板中使用的前缀之外,

xsltproc无法使用带前缀的参数名称指定参数。这是不幸的,因为根据XML Namespaces specification的§4,

  

应用程序应该在构造范围超出包含文档的名称时使用命名空间名称而不是前缀。

以下是避免假设特定前缀选择的三种可能方法。

1:使用其他XSLT处理器Saxon支持在不知道前缀的情况下设置参数。语法是:

java net.sf.saxon.Transform -s:input.xml -xsl:template.xsl \
  "{http://example.com/}foo='Something'"

2:修补xsltproc以支持Libxslt bug 764195包含一个补丁,可添加类似Saxon的语法来设置参数:

xsltproc --stringparam {http://example.com/}:foo Something \
  template.xsl input.xml

3:查找前缀绑定。一个简单的XPath查询可以查找模板中使用的前缀,然后使用它构造参数名称:

PREFIX=`xmllint --noout template.xsl --xpath \
          "name(/*/namespace::*[string()='http://example.com/'])"`
xsltproc --stringparam "$PREFIX:foo" Something template.xsl input.xml