Почему в XSLT я не могу установить атрибут select для value-of с помощью атрибута xsl: - PullRequest
3 голосов
/ 20 августа 2010

У меня есть константа и переменная, которую я хочу соединить, чтобы выбрать определенный узел, вот что я хочу сделать:

<xsl:attribute name="value">
 <xsl:value-of>
  <xsl:attribute name="select">
   <xsl:text>/root/meta/url_params/
   <xsl:value-of select="$inputid" />
  </xsl:attribute>
 </xsl:value-of>
</xsl:attribute>

Почему это не работает, и что я могсделать instad?

Ответы [ 2 ]

6 голосов
/ 20 августа 2010

Хотя @Alejandro прав, что в общем случае потребуется динамическая оценка (и это может быть обеспечено в XSLT 2.1+), существуют управляемые более простые случаи.

Например, , если $inputid содержит только имя, вы, вероятно, захотите это :

<xsl:value-of select="/root/meta/url_params/*[name()=$inputid]"/>

Мы можем реализовать довольно общий динамический анализатор XPath, если ограничим каждый путь расположения только именем элемента :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:param name="inputId" select="'param/yyy/value'"/>

 <xsl:variable name="vXpathExpression"
  select="concat('root/meta/url_params/', $inputId)"/>

 <xsl:template match="/">
  <xsl:value-of select="$vXpathExpression"/>: <xsl:text/>

  <xsl:call-template name="getNodeValue">
    <xsl:with-param name="pExpression"
         select="$vXpathExpression"/>
  </xsl:call-template>
 </xsl:template>

 <xsl:template name="getNodeValue">
   <xsl:param name="pExpression"/>
   <xsl:param name="pCurrentNode" select="."/>

   <xsl:choose>
    <xsl:when test="not(contains($pExpression, '/'))">
      <xsl:value-of select="$pCurrentNode/*[name()=$pExpression]"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="getNodeValue">
        <xsl:with-param name="pExpression"
          select="substring-after($pExpression, '/')"/>
        <xsl:with-param name="pCurrentNode" select=
        "$pCurrentNode/*[name()=substring-before($pExpression, '/')]"/>
      </xsl:call-template>
    </xsl:otherwise>
   </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к этому документу XML :

<root>
  <meta>
    <url_params>
      <param>
        <xxx>
          <value>5</value>
        </xxx>
      </param>
      <param>
        <yyy>
          <value>8</value>
        </yyy>
      </param>
    </url_params>
  </meta>
</root>

желаемый, правильный результат получается :

root/meta/url_params/param/yyy/value: 8
5 голосов
/ 20 августа 2010

Не существует оценки времени выполнения для выражения XPath в стандартном XSLT 1.0

Таким образом, в зависимости от значения $inputid, у вас могут быть разные решения.

Но это/root/meta/url_params/$inputid неверно, потому что правая часть / должна быть относительным путем в XPath 1.0 (в XPath 2.0 также может быть вызовом функции).

Для этого конкретного случая выможно использовать:

/root/meta/url_params/*[name()=$inputid]

или

/root/meta/url_params/*[@id=$inputid]

В общем случае я пойду с шаблоном Уокера, как ответ Димитра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...