Использовать значение переменной в Xpath

У меня есть следующий XML

<root>
  <ns:Search xmlns:ns="http://example.com/1.0/">
    <ns:AllClass>
      <ns:class1>
        <ns:node1>fhgfjh</ns:node1>
        <ns:node2>Aprtyrtyril</ns:node2>
        <ns:node3>Juklyuiyly</ns:node3>
      </ns:class1>
      <ns:class2>
        <ns:node1>dfgd</ns:node1>
        <ns:node2>trytyu</ns:node2>
        <ns:node3>sgsdfg</ns:node3>
      </ns:class2>
      .
      .
      .
      .
      .
      .
    </ns:AllClass>
  </ns:Search>
  <ns:Req xmlns:ns="http://example.com/1.0/">
    <ns:classId>class1</ns:classId>
    <ns:othertag>asdfg</ns:othertag>
    .
    .
    .
    .
    .
  </ns:Req>
</root>

и следующий XSL

<xsl:template match="root">
    <xsl:variable name="class" select="/root/Req/classId" />
    <ns1:Request xmlns:ns1="http://example.com/ns1">
      <ns1:node>
        <xsl:value-of xmlns:ns="http://example.com/1.0/" xmlns:ns1="http://abc.xyz.com/1.0/" select="/root/Search/AllClass[Value=$class]/node1" />
      </ns1:node>
    </ns1:Request>
  </xsl:template>

Я получаю имя класса внутри моего XML в узле classId. Я хочу получить значение «node1» класса, такое же, как мое значение внутри тега «classId». Я использую переменную class и сохраняю значение classId и пытаюсь получить значение node1, используя переменную внутри Select Xpath. Но это не работает. Пожалуйста помоги.


person SM Ahmed    schedule 15.07.2016    source источник
comment
ты пробовал вот так /root/Search/AllClass/$class/node1   -  person Vinod    schedule 15.07.2016
comment
Да это уже пробовал   -  person SM Ahmed    schedule 15.07.2016
comment
Я думаю, это сработает /root/Search/AllClass/data($class)/node1   -  person Vinod    schedule 15.07.2016


Ответы (1)


Вы должны использовать пространство имен в выражениях XPATH:

<xsl:template match="root">
    <xsl:variable name="class_tmp" xmlns:ns="http://example.com/1.0/" select="/root/ns:Req/ns:classId" />
    <xsl:variable name="class" select="concat('ns:',$class_tmp)" />
    <xsl:message><xsl:value-of select="$class"/></xsl:message>
    <ns1:Request xmlns:ns1="http://example.com/ns1">
        <ns1:node>
            <xsl:value-of xmlns:ns="http://example.com/1.0/" xmlns:ns1="http://abc.xyz.com/1.0/" select="/root/ns:Search/ns:AllClass/*[name()=$class]/ns:node1" />
        </ns1:node>
    </ns1:Request>
</xsl:template>
person Alexander Dyuzhev    schedule 15.07.2016
comment
Хорошо, когда я использую статический xpath без использования переменной, я получаю значение - person SM Ahmed; 15.07.2016
comment
Спасибо, я думаю, пространство имен было причиной того, что оно не работало - person SM Ahmed; 15.07.2016