2015-12-16 3 views
1

Рассмотрим следующий XML:использование имя локального с Concat-функции

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <node1></node1> 
    <attribute1>test</attribute1> 
</root> 

и это преобразование:

<xsl:template match="/root"> 
    <result> 
     <xsl:for-each select="*[starts-with(local-name(), 'node')]"> 
      --- 
      <xsl:value-of select="concat('attribute', string(position()))"/> 
      --- 
      <xsl:variable name="attribute" select="../*[local-name() = 'attribute1']"/> 
      <xsl:value-of select="$attribute"/> 
      --- 
      <xsl:variable name="test" 
       select="../*[local-name() = concat('attribute', string(position()))]"/> 
      <xsl:value-of select="$test"/> 
      --- 
      <xsl:variable name="test2" 
       select="../*[local-name() = concat('attribut','e1')]"/> 
      <xsl:value-of select="$test2"/> 
      --- 
     </xsl:for-each> 
    </result> 
</xsl:template> 

Удивительно для меня, мои переменные $test является пустой. Я предполагаю, что это связано с использованием функции concat или string, но я не могу понять, что вызывает это.

Любые идеи? Огромное спасибо!

ответ

2

Ну, позиция узла attribute1 в узле ../* равна 2 и position() относится к этому. Таким образом, работает следующая линия

<xsl:variable name="test" select="../*[local-name() = concat('attribute', string(position()-1))]"/> 
<xsl:value-of select="$test"/> 

и дает желаемый результат.

2

Обратите внимание, как отличается результат теста будет, если изменить вход в:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <attribute1>test</attribute1> 
    <node1></node1> 
</root> 

Почему? Поскольку функция position(), помещенная внутри предиката , возвращает положение отфильтрованного узла (../* в вашем примере), а не позицию текущего узла. См. Более подробное объяснение здесь: http://www.w3.org/TR/xpath/#predicates

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