1

我不是 XSLT 专家,在网上找不到类似的示例。我想将来自多个文件的应用程序列表组合成一个可用于搜索的 var。

基本上,当我用新变量替换原始变量 decleration 时,XSLT 不喜欢它。我确实将变量内容输出到了一个文件中,它们在 XML 元素的格式上是相同的,所以它必须在某个地方链接到变量的一些元数据失败。

所有文件中的 XML 元素格式

<include-application name="appname" type="blah"/>

原始变量

<xsl:variable name="applications" select="board/packaging/*/include-application"/>

新变量定义

<xsl:variable name="applications">
    <xsl:copy-of select="board/packaging/*/include-application"/>
    <xsl:for-each select="board/packaging/applications/include">
        <xsl:variable name="appset" as="xs:string" select="@name"/>
        <xsl:variable name="includefile" as="xs:string" select="concat('../share/appsets/', $appset, '.xml')"/>
        <xsl:copy-of select="document($includefile)/applications/include-application"/>
    </xsl:for-each>
</xsl:variable>

然后,当我尝试访问元素以选择某些东西时,它会因新的变量定义而失败(第 39 行是下面块中的第一个)。

<xsl:variable name="type" select="$applications[@name = $appname]/@type"/>
<xsl:variable name="appid" select="$app-names/application-package-name[@name = $appname]/appid[@type = $type]/@value"/>

XPath 错误:无效类型运行时错误:文件 xslt/blah.xslt 第 39 行元素变量无法评估变量“类型”的表达式。

谢谢

大卫

4

3 回答 3

0

问题应该是该变量包含一个 XML 片段而不是一个节点集(例如,参见这个) - 不同的 XSLT 处理器具有不同的扩展函数来进行转换 - 例如使用 Microsoft 处理器你会这样做:

<xsl:variable name="type" select="msxsl:node-set($applications)[@name = $appname]/@type"/>

其他处理器具有不同的功能(或不同命名空间中的相同功能)

于 2013-10-03T15:15:50.617 回答
0

使用上述答案的组合并更深入地研究它,我使用 exslt 扩展来转换为节点集,它现在可以完美运行。

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common">
...
<xsl:variable name="applications" as="element(include-application)*">
...
<xsl:variable name="type" select="exslt:node-set($applications)/include-application[@name = $appname]/@type"/>
于 2013-10-03T16:31:24.900 回答
0

由于您使用的是 XSLT 2.0,正如您对 的使用所证明的那样as=,您需要声明变量的内存组织以便稍后对其进行操作。我认为您需要做的只是将变量的第一行更改为:

<xsl:variable name="applications" as="element(include-application)*">
  ...

这将告诉处理器不要构建树,而是构建节点集。

在我的 XSLT 书籍的第 223 页上有有用的信息和图表,可在http://www.CraneSoftwrights.com/training/#ptux上以“试用并购买”的方式免费下载……如果您决定不购买要支付这本书的费用,请删除您免费下载的副本。

于 2013-10-03T15:19:36.100 回答