Я просматриваю XML-документ, выбирая все элементы и создавая ссылки на основе предка, который обычно состоит из двух узлов в дереве , но иногда 3 или 4 узла вверх. Для большинства элементов использование <xsl:value-of select="translate(../../@name,$uc,$lc)" />
работает очень хорошо, но для случаев, когда у предка 3 или около того узлов, я хотел бы использовать <xsl:value-of select="translate(ancestor::package/@name,$uc,$lc)" />
, но это не сработает.Выбор атрибута предка; «../» «работает», «предк ::» не
Я использую xsltproc из Ruby для выполнения своих 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: node, а целевой файл не имеет пространства имен для xsl. Я бы предпочел не изменять целевой файл, потому что это производственный код --- я просто пишу инструмент autodoc.
Был ли второй вариант ниже для вас? Могут возникнуть проблемы, когда токены вложены в элемент xsl - я не уверен, что внутренние элементы возвращаются к пространству имен по умолчанию, и в этом случае вы даже не можете найти элементы маркера. – 2008-11-03 20:44:00