2015-02-23 3 views

ответ

6

наиболее эффективный способ решения КИО s, как это в XSLT, как правило, используется ключ . Ключевое определение идет на верхнем уровне таблицы стилей, вне каких-либо шаблонов, а также определяет, какие узлы вы хотите получить и как вычислить идентифицирующее значение ключа для каждого одного

<xsl:key name="writerById" match="writer" use="@id_writer" /> 

После того, как ключ определяется вы можете получить соответствующие узлы по значению ключа с помощью функции

<xsl:value-of select="key('writerById', @id_writer)/name"/> 

некоторых XSLT процессоров (в частности, в последние версии саксонской EE) автоматически оптимизируют //writer[@id_writer = current()/@id_writer] предикатов для выполнения столь же эффективно, как явный ключ на основе подход, но это не то, что вы можете обязательно полагайтесь, если вы используете более старую или менее сложную ocessor.

1

Я думаю, что вы пытаетесь связать film и writer их атрибутов, поэтому попробуйте следующее:

<xsl:for-each select="film"> 
    <xsl:value-of select="../writer[@id_writer=current()/@id_writer]/name"/> 
</xsl:for-each> 
+1

'../ writer', а не просто' writer' - они братья и сестры, а не родители и дети. –

+0

Спасибо, @IanRoberts .. Немного над уверенностью, что я его не тестировал :) –

1

Прямой ответ на ваш «что ставить здесь» является

current()/@id_writer 

Однако это не единственное, что нужно, чтобы сделать его работу, так как узел автор не является частью дерева узла фильма. Полный рабочий ответ, основанный на ваш вопрос:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text" encoding="iso-8859-1" omit-xml-declaration="yes" /> 

    <xsl:template match="/body"> 
     <xsl:for-each select="film"> 
      <xsl:value-of select="/body/writer[@id_writer=current()/@id_writer]/name"/> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:transform> 

Полный XML кормить это:

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
    <writer id_writer="1"> 
     <name>name</name> 
    </writer> 

    <film id_writer="1"> 
    </film> 
</body> 

Рабочий пример здесь: http://xsltransform.net/bFDb2Ck

+0

Пожалуйста, убедитесь, что ваш ответ содержит тот же код, что и ваш рабочий пример. Ваш рабочий пример действительно работает, ваш код здесь нет. –

+0

Я попытался ответить только на точный вопрос, будучи «что поставить здесь». Но теперь я отредактировал свой ответ, чтобы уточнить. –

+1

Это не то, что я имел в виду. Прежде чем вы отредактировали ответ, перед выражением пути не было '/ body /', и это никуда не привело. –

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