0

我正在运行一个 XML 文档,选择所有元素,并基于祖先创建链接,该祖先通常是树中的两个节点,但偶尔也会有 3 或 4 个节点。对于大多数元素, using<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>

编辑:啊,对,忘记了选择的名称空间。在大多数情况下,解析器正确地找到了那个祖先,但是当那里有一个 xsl: 节点时它仍然找不到它,并且目标文件没有 xsl 的命名空间。我不想修改目标文件,因为它是生产代码——我只是在编写一个自动文档工具。

4

3 回答 3

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() 规范在这里

于 2008-11-03T19:31:59.843 回答
1

我认为,只要您使用命名空间感知 XML 处理器,就无法在目标文档中为“xsl”前缀声明命名空间。当您尝试使用 xsltproc 和给定样式表转换目标文档时,您没有看到任何错误吗?

于 2008-11-03T22:17:22.397 回答
0

您可能会仔细检查您的工具使用的 XSLT 版本。我相信 XSLT 1.0 不支持“ancestor::<tag>...”

于 2008-11-03T22:36:30.127 回答