将 XML 作为参数传递和解析到 XSLT 2.0

Posted

技术标签:

【中文标题】将 XML 作为参数传递和解析到 XSLT 2.0【英文标题】:Passing and parsing XML as a parameter to XSLT 2.0 【发布时间】:2014-08-05 19:10:40 【问题描述】:

我试图弄清楚如何将 XML 传递到 XSLT 文档中并像在任何节点上一样对其进行解析。

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:param name="xmlparam"></xsl:param>

    <xsl:template match="/">
        <xsl:value-of select="node()"></xsl:value-of>
        <xsl:value-of select="$xmlparam/coll"></xsl:value-of>
    </xsl:template>
</xsl:stylesheet>

xml参数:

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

<coll>
    <title>Test</title>
    <text>Some text</text>
</coll>

输入:

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

<coll>
    Root doc
</coll>

输出:

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

XPTY0019: Required item type of first operand of '/' is node(); supplied value has item type xs:untypedAtomic

有谁知道如何解析作为参数传入 XSLT 的 XML?由于某些限制,我无法读取文件,它需要是一个参数。

【问题讨论】:

见:***.com/questions/23767097/… 您使用哪个 XSLT 2.0 处理器,如何/在哪里传递参数?这一切都取决于您使用的 XSLT 处理器以及它提供的用于解析 XML 和传递参数的 API,例如,请参阅 ***.com/questions/24077219/… 以获取具有 .NET 版本的 Saxon 9 的示例。 【参考方案1】:

您可以使用 document 函数让样式表解析您的 XML 输入,例如喜欢(凭记忆,所以可能不完全准确)

<xsl:variable name="myData" select="document('myData')"/>

并使用您的 Transformer 注册自定义 URIResolver。此自定义 URIResolver 将获取 "myData" 作为其 resolve 方法的参数 href 的值,然后可以从例如获取文档的内容。 String。这将为您提供与将内容添加为参数大致相同的灵活性。

代码草图(假设 MyURIResolver 的实现很明显):

Transformer myTransformer = getMyTransformer();
String myXmlDocument = getMyXmlDocumetAsString();
URIResolver myURIResolver = new MyURIResolver();
myURIResolver.put("myData", myXmlDocument);
myTransformer.setURIResolver(myURIResolver);
myTransformer.transform(source, result);

【讨论】:

以上是关于将 XML 作为参数传递和解析到 XSLT 2.0的主要内容,如果未能解决你的问题,请参考以下文章

在 Wordpress 中使用 XSLT 解析 XML

XSLT(2.0 或 3.0)方法将存储在 xml 中的每个逗号分隔值的整个 xml 复制到单独的 xml 文件中

使用 XSLT 2.0/3.0 使用多个步骤将 CDATA 中的纯文本解析为 html。那里的一部分

如何将 xslt 中的参数用作 XPath?

在 msxsl 中将节点作为参数传递:来自 XSLT for-each 的脚本 javascript 函数不起作用

XSLT 使用 xslt 2.0 或更高版本将纯文本文件处理为 XML