XPath выбирает узлы несколько раз в зависимости от атрибутов для преобразования XSL - PullRequest
0 голосов
/ 05 января 2012

У меня есть такой узел:

<foo my:first="yes" my:second="no">text</foo>

Мне нужен запрос XPath или функция XSLT, которая выбирает каждый узел с атрибутами в пространстве имен «my». Но если элемент имеет несколько атрибутов "my", элемент должен быть выбран несколько раз.

В настоящее время у меня есть это:

<xsl:template match="//*[@my:*]">
  <bar>
    <xsl:variable name="attributeName" select="local-name(./@my:*)" />
    <xsl:variable name="attributeValue" select="./@my:*" />
    <xsl:attribute name="name">
      <xsl:value-of select="$attributeName" />
    </xsl:attribute>
    <xsl:attribute name="value">
      <xsl:value-of select="$attributeValue" />
    </xsl:attribute>
    <xsl:value-of select="." />
  <bar>
</xsl:template>

И, естественно, он поддерживает только одиночные атрибуты "my", что приводит к преобразованию, подобному этому:

<bar name="attr_in_my_namespace" value="value_of_that_attr">text</bar>

Если я попробую это с узлом, который я представил в начале, я получу следующую ошибку:

A sequence of more than one item is not allowed as the first argument of
  local-name() (@my:first, @my:second) 

Итак, ожидаемый результат будет:

<bar name="first" value="yes">text</bar>
<bar name="second" value="no">text</bar>

Как мне этого добиться?

1 Ответ

2 голосов
/ 05 января 2012

Мне кажется, что вы просто хотите обработать узлы атрибута, например,

<xsl:template match="*/@my:*">
  <bar name="{local-name()}" value="{.}">
    <xsl:value-of select=".."/>
  </bar>
</xsl:template>

, а затем

<xsl:template match="*[@my:*]">
  <xsl:apply-templates select="@my:*"/>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...