【问题标题】:What Toolchains Support Passing in a Nodeset to an XSLT Transformation as a Parameter?哪些工具链支持将节点集作为参数传递给 XSLT 转换?
【发布时间】:2009-10-12 18:27:18
【问题描述】:

这是我对 XSLT 的 previous question 的回答的后续。

回顾一下,我没有意识到如果没有 EXSLT,XSLT 将无法让您动态创建带有字符串值的 xpath 表达式。建议的解决方法之一是

在执行转换之前查询输入文档的 DOM,并将节点集传递给转换

我使用 Apache Ant 进行转换,并根据 xslt/style 任务的参数上的 the manual

要放入参数的文本值。最初的目的是作为 XSL 表达式。

听起来 Apache Ant 不支持这个。不过,这让我想知道,这种语义在支持它的系统中如何工作?

那么,什么工具链或系统支持将源文档中的节点集作为参数传递到转换中。示例代码加分。

【问题讨论】:

  • 您只需要通过 ant 将参数传递给 xslt 还是要将部分构建文件作为参数传递给 xslt 样式表?

标签: xml xslt ant toolchain


【解决方案1】:

您不能在标准 xslt 1.0 中将节点集作为参数传递。 为此,您必须使用 xslt 2.0 解析器。

例如: http://wiki.apache.org/ant/UsingAntWithXSLT20AndSaxon

【讨论】:

  • 节点集是 XSLT/XPath 1.0 的有效数据类型,您可以将它们作为参数传递。怎么做?这取决于 XSLT 处理器。
【解决方案2】:

我不完全确定我的答案,因为我似乎无法正确理解您的问题,但根据您引用的主题和您的引语,我可以提出以下建议:

build.xml:

<?xml version="1.0" encoding="UTF-8"?>

<project name="Test XSLT" default="test-xslt" basedir=".">
    <target name="test-xslt">
        <xslt in="test.xml" style="ant-with-param.xsl" out="ant-with-param-out.xml">
            <param name="param-set-id" expression="2"/>
        </xslt>
    </target>
</project>

test.xml:

<?xml version="1.0" encoding="UTF-8"?>

<params>
    <set id="1">
        <param name="name" value="Name from the first set"/>
    </set>
    <set id="2">
        <param name="name" value="Name from the second set"/>
    </set>
</params>

ant-with-param.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                extension-element-prefixes="exsl">
    <xsl:param name="param-set-id"/>
    <xsl:variable name="param-set" select="//params/set[@id = $param-set-id]"/>

    <xsl:template match="/">
        <name>
            <xsl:value-of select="exsl:node-set($param-set)//param[@name = 'name']/@value"/>
        </name>
    </xsl:template>
</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
<name>Name from the second set</name>

给定样式表根据从构建文件传递的变量值从输入文档中获取参数。参数是在 XPath 表达式的帮助下从源文档中获取的,然后在 exsl:node-set() 扩展函数的帮助下使用。默认情况下,ant 使用 Xalan 作为 xslt 处理器。可以在project's home page 找到其扩展的完整列表。

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    相关资源
    最近更新 更多