2008-11-03 7 views
0

Я просматриваю 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.

+0

Был ли второй вариант ниже для вас? Могут возникнуть проблемы, когда токены вложены в элемент xsl - я не уверен, что внутренние элементы возвращаются к пространству имен по умолчанию, и в этом случае вы даже не можете найти элементы маркера. – 2008-11-03 20:44:00

ответ

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 местное имя () spec here.

1

Я думаю, что нет никакого способа объявить пространство имен для префикса «xsl» в целевом документе до тех пор, пока вы используете XML-процессоры с поддержкой имен. Вы не видите никаких ошибок при попытке преобразовать целевой документ с помощью xsltproc и данной таблицы стилей?

0

Вы можете проверить, какая версия XSLT использует ваши инструменты. Я считаю, что XSLT 1.0 не поддерживает «ancestor :: <tag> ...»

Смежные вопросы