我有以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<XmlTest>
<Pictures attr="Pic1">Picture 1</Pictures>
<Pictures attr="Pic2">Picture 2</Pictures>
<Pictures attr="Pic3">Picture 3</Pictures>
</XmlTest>
虽然这个XSL做了预期的事情(输出第一张图片的attr):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/XmlTest">
<xsl:variable name="FirstPicture" select="Pictures[1]">
</xsl:variable>
<xsl:value-of select="$FirstPicture/@attr"/>
</xsl:template>
</xsl:stylesheet>
似乎不可能使用xsl在变量声明中做同样的事情:copy-of:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/XmlTest">
<xsl:variable name="FirstPicture">
<xsl:copy-of select="Pictures[1]"/>
</xsl:variable>
<xsl:value-of select="$FirstPicture/@attr"/>
</xsl:template>
</xsl:stylesheet>
好奇: 如果我只是在第二个例子中选择“$ FirstPicture”而不是“$ FirstPicture / @ attr”,它会按预期输出图片1的文本节点......
在你们建议我重写代码之前: 这只是一个简化的测试,我的真正目的是使用命名模板在变量FirstPicture中选择一个节点并重复使用它进行进一步选择。
我希望有人可以帮助我理解这种行为,或者可以建议我选择一个可以轻松重用的代码节点的正确方法(在我的实际应用程序中,哪个节点是第一个节点很复杂)。感谢。
编辑(感谢Martin Honnen): 这是我的工作解决方案示例(另外使用单独的模板来选择所请求的图片节点),使用MS XSLT处理器:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
version="1.0">
<xsl:template match="/XmlTest">
<xsl:variable name="FirstPictureResultTreeFragment">
<xsl:call-template name="SelectFirstPicture">
<xsl:with-param name="Pictures" select="Pictures" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="FirstPicture" select="msxsl:node-set($FirstPictureResultTreeFragment)/*"/>
<xsl:value-of select="$FirstPicture/@attr"/>
<!-- further operations on the $FirstPicture node -->
</xsl:template>
<xsl:template name="SelectFirstPicture">
<xsl:param name="Pictures"/>
<xsl:copy-of select="$Pictures[1]"/>
</xsl:template>
</xsl:stylesheet>
不太好,在XSLT 1.0中不能直接从模板输出节点,但是使用额外的变量至少不是不可能的。
答案 0 :(得分:4)
如果你做了
,那么使用XSLT 1.0处理器 <xsl:variable name="FirstPicture">
<xsl:copy-of select="Pictures[1]"/>
</xsl:variable>
变量是一个结果树片段,在纯XSLT 1.0中你可以用它来做copy-of
(或value-of
)。如果要应用XPath,首先需要将结果树片段转换为节点集,大多数XSLT 1.0处理器都支持扩展函数,所以尝试
<xsl:variable name="FirstPictureRtf">
<xsl:copy-of select="Pictures[1]"/>
</xsl:variable>
<xsl:variable name="FirstPicture" select="exsl:node-set(FirstPictureRtf)/Pictures/@attr">
在样式表中定义xmlns:exsl="http://exslt.org/common"
。
请注意,您需要检查XSLT 1.0处理器是否支持EXSLT扩展功能,或者是否支持另一个命名空间中的类似功能(例如各种MSXML版本)。