gpt4 book ai didi

xslt - 结果树片段到节点集 : generic approach for all xsl engines

转载 作者:行者123 更新时间:2023-12-04 16:48:29 25 4
gpt4 key购买 nike

回答另一个线程(见 stackoverflow: generate css color schemes) 我遇到了下面的问题,不同的 xsl 引擎似乎需要不同的方法来将结果树片段转换为节点集。

简化问题(但有关此背后的完整故事,请参见上面的链接),我希望有一个包含颜色值列表的内联树。由于这必须在 Xpath 表达式中使用,我必须从中创建一个节点集,专门用于 MSXML x.x xsl 引擎(内置的 XML Spy 在解释包含构造为 rtf 的变量的 Xpath 表达式时比较容易)。
另一个线程stackoverflow: automating-exsltnode-set在那里帮助了我。
生成的节点集用于从输入 XML 创建新变量 rtf。
同样,当在 Xpath 表达式中使用新变量时,MSXML 会报错,因此我使用 node-set 函数从中创建一个节点集。
到目前为止一切顺利,MSXML x.x 不再出错。
但是当我在 XML Spy built-in 或 Saxon 9he 中运行相同时,我得到另一个错误:似乎节点集函数是未知的:

Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set() in variable colorList

请注意,在此特定示例中不需要这种两步方法,但正如我所说,我简化了一些事情;我只是想知道如何编写一个适用于所有 xsl 引擎的 XSLT 1.0 转换。

我使用的 XSLT:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:std="http://whatever"
xmlns:exslt="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="std exslt">

<xsl:output method="xml" indent="yes"/>

<std:colors>
<color>#0000FF</color>
<color>#FF0000</color>
</std:colors>

<xsl:variable name="colors" select="document('')/*/std:colors"/>

<xsl:variable name="std:colorList">
<xsl:for-each select="//testid">
<xsl:variable name="pos" select="position() mod 2"/>
<xsl:element name="color">
<xsl:attribute name="testid"><xsl:value-of select="."/></xsl:attribute>
<xsl:value-of select="$colors/color[$pos + 1]"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>

<xsl:variable name="colorList" select="exslt:node-set($std:colorList)"/>

<xsl:template match="/">
<output>
<xsl:copy-of select="$colorList/color"/>
</output>
</xsl:template>

</xsl:stylesheet>

输入文件:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<defects>
<testid>111</testid>
</defects>
<defects>
<testid>999</testid>
</defects>
</NewDataSet>

结果为 MSXML 3.0/4.0/6.0:
<?xml version="1.0" encoding="UTF-16"?>
<output>
<color testid="111">#FF0000</color>
<color testid="999">#0000FF</color>
</output>

Saxon9he 中的结果:
Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set()
in variable colorList

生成 XML Spy 内置 xsl 引擎:
Error in XPath expression
Unknown function - Name and number of arguments do not match any function signature in the static context - 'urn:schemas-microsoft-com:xslt:node-set'

最佳答案

对于 MSXML 以外的处理器,请使用 exslt:node-set() 函数。 (http://www.exslt.org/)。 (将 exslt 前缀绑定(bind)到 Microsoft 版本的函数有点奇怪——这让我困惑了一段时间!)

您可以使用 function-available() 测试哪些函数可用:

<xsl:choose>
<xsl:when test="function-available('exslt:node-set')"...
<xsl:when test="function-available('msxsl:node-set')"...

对于 Saxon-HE 和其他 XSLT 2.0 处理器,您不需要任何这些功能,所以使用
<xsl:when test="xsl:version='2.0'">

关于xslt - 结果树片段到节点集 : generic approach for all xsl engines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9837589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com