我正在浏览XML文档,选择所有元素,并根据祖先创建链接,该祖先通常是树中的两个节点,但偶尔会有3或4个节点。对于大多数元素,使用<xsl:value-of select="translate(../../@name,$uc,$lc)" />
工作正常,但对于祖先大约3个节点的情况,我想使用<xsl:value-of select="translate(ancestor::package/@name,$uc,$lc)" />
,但这不起作用。
我正在使用Ruby的xsltproc进行我的XSL转换。
示例树(是的,它有XSLT,不,我不是要处理它):
<package name="blork!" xmlns="http://xml.snapin.com/XBL">
<xsl:template name="doSomething">
<tokens>
<token name="text-from-resource" export="public" />
</tokens>
</xsl:template>
</package>
我正在使用的XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s4="http://xml.snapin.com/XBL">
<xsl:template match="/">
<xsl:if test="count(//s4:token) >0">
<xsl:text>Tokens!</xsl:text>
<xsl:for-each select="//s4:token">
<xsl:choose>
<xsl:when test="@export='global'" />
<xsl:otherwise>
<xsl:value-of select="translate(ancestor::s4:package/@name,$uc,$lc)" />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
编辑:啊,对,忘记了select上的命名空间。在大多数情况下,解析器发现祖先是正确的,但当那里有一个xsl:node时它仍然无法找到它,并且目标文件没有xsl的命名空间。我不想修改目标文件,因为它是生产代码---我只是在编写一个autodoc工具。
答案 0 :(得分:3)
您的问题可能与命名空间有关。您没有在示例树中包含这些内容 - 您可以更精确地粘贴您的内容吗?假设程序包节点与令牌节点位于同一名称空间中,请尝试:
<xsl:value-of select="translate(ancestor::s4:package/@name,$uc,$lc)" />
您也可以只测试非限定名称,但速度会慢一些:
<xsl:value-of select="translate(ancestor::*[local-name()='package']/@name,$uc,$lc)" />
W3C local-name()spec here。
答案 1 :(得分:1)
我认为只要您使用名称空间感知的XML处理器,就无法在目标文档中为'xsl'前缀声明名称空间。当您尝试使用xsltproc和给定样式表转换目标文档时,是否没有看到任何错误?
答案 2 :(得分:0)
您可以仔细检查您的工具使用的XSLT版本。我相信XSLT 1.0不支持“ancestor ::&lt; tag&gt; ...”