Соответствует только одному из многих неизвестных узлов с xpath - PullRequest
1 голос
/ 21 сентября 2009

Я пытаюсь сопоставить только один из каждого узла с общим соответствием. Можно ли сделать это вообще? Я бы предпочел просто сопоставить один из каждого узла с одинаковым local-name ()

<xsl:variable name="xmltree">
  <node />
  <anothernode />
  <node />
  <anothernode />
  <unknown />
  <anothernode />
  <node />
  <unknown />
</xsl:variable>

<xsl:template match="/">
  <xsl:apply-templates select="$xmltree/*" mode="MODULE"/>
</xsl:template>

<xsl:template match="*" mode="MODULE" /> <!-- EMPTY MATCH -->

<xsl:template match="node[1]|anothernode[1]|unknown[1]" mode="MODULE">
  <!-- Do something -->
</xsl:template>

1 Ответ

1 голос
/ 21 сентября 2009

Это вопрос группировки , а в XSLT 1.0 наиболее эффективным способом группировки является метод Мюнхена.

Если количество элементов не слишком велико, может быть достаточно следующего короткого кода :

<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:template match="/*/*">
     <xsl:copy-of select=
      "self::*[not(preceding-sibling::*
                      [name() = name(current())]
                   )
               ]"/>
    </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему исходному XML-документу :

<t>
    <node />
    <anothernode />
    <node />
    <anothernode />
    <unknown />
    <anothernode />
    <node />
    <unknown />
</t>

Требуемый результат получен :

<node/>
<anothernode/>
<unknown/>

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

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