Изменение запроса XPath со значения внутри for-each - PullRequest
2 голосов
/ 31 мая 2011

Я пытаюсь сделать для каждого на каждой странице:

<xsl:for-each select="/root/page">
   <xsl:value-of select="/root/titles/@page/"/>
</xsl:for-each>

Пример XML;

<root>
  <titles>
   <en>A title</en>
   <de>Ein Titel</de> 
 </titles>
 <page title="de">
    ....
 </page>
</root>

Проблема, с которой я столкнулся, заключается в том, что XPath не разрешаетсяна /root/titles/de/...
Как мне заставить его работать?

Ответы [ 4 ]

1 голос
/ 31 мая 2011

Используйте xsl:key. Поскольку не совсем понятен вывод, который вам нужен, я предоставил вам только пример, показывающий, как получить title из titles для каждого page в соответствии с языком страницы.


XSLT 1.0 протестировано под Saxon 6.5.5

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="titles" match="titles/*" use="local-name()"/>

    <xsl:template match="/root">
     <xsl:for-each select="page">
             <xsl:value-of select="concat('title-',@title,key('titles',@title),'&#xA;')"/>
     </xsl:for-each>
 </xsl:template>

</xsl:stylesheet>

Применяется к этому входу

 <?xml version="1.0" encoding="UTF-8"?>
<root>
  <titles>
   <en>A title</en>
   <de>Ein Titel</de> 
 </titles>
 <page title="de">
    ....
    </page>
     <page title="en">
    ....
 </page>
</root>
1017 * * производит:
title-de:Ein Titel
title-en:A title

Протестировано на Mozilla Firefox 3.6.17 следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test_trans.xsl"?>
<root>
  <titles>
   <en>A title</en>
   <de>Ein Titel</de> 
 </titles>
 <page title="de">
    ....
    </page>
     <page title="en">
    ....
 </page>
</root>

Выдает

 title-deEin Titeltitle-enA title

Очевидно, без новых строк, потому что мы отображаем его в браузере, и преобразование должно быть изменено для получения HTML.

1 голос
/ 31 мая 2011

обновлен

 <xsl:for-each select="/root/page">
   <xsl:variable name="language" select="@title"/>
   <xsl:value-of select="/root/titles/*[name()=$language]"/>
</xsl:for-each>

теперь у меня это работает!

1 голос
/ 31 мая 2011

Не совсем понятно, что вы хотите, но похоже, что вы должны знать, что xsl:for-each меняет контекст на выбранный узел, как это делает шаблон.Так что это может вас где-то найти:

<xsl:for-each select="/root/page">
   <xsl:value-of select="/root/titles/*[name()=current()/@title]"/>
</xsl:for-each>

Надеюсь, это поможет.

0 голосов
/ 31 мая 2011
<xsl:for-each select="/root/page">
    <xsl:variable name="language" select="@title"\>
    <xsl:value-of select="/root/titles/$language"/>
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...