XSLT - Как выбрать сверху а сверху б - PullRequest
2 голосов
/ 23 июня 2011

как я могу извлечь первые 2 C-значения ('Baby' и 'Cola'), где B - 'RED'.Входной экземпляр:

<Root>
  <A>
    <B>BLACK</B>
    <C>Apple</C>
  </A>
  <A>
    <B>RED</B>
    <C>Baby</C>
  </A>
  <A>
    <B>GREEN</B>
    <C>Sun</C>
  </A>
  <A>
    <B>RED</B>
    <C>Cola</C>
  </A>
  <A>
    <B>RED</B>
    <C>Mobile</C>
  </A>
</Root>

Выходной экземпляр должен быть:

<Root>
  <D>Baby</D>
  <D>Cola</D>
</Root>

Я думал о комбинации переменных for-each и global.Но в XSLT невозможно изменить значение глобальной переменной, чтобы сломать for-each.Я понятия не имею больше.

Ответы [ 3 ]

3 голосов
/ 23 июня 2011

Нет необходимости разбивать для каждого:

<xsl:template match="Root">
  <xsl:copy>
    <xsl:for-each select="(A[B='RED']/C)[position() &lt; 3]">
      <D><xsl:value-of select="." /></D>
    </xsl:for-each>
  </xsl:copy>
</xsl:template>
2 голосов
/ 23 июня 2011

Это очень элегантно решается с xsl:key.

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

  <xsl:key name="kB" match="A" use="B" />

  <xsl:template match="Root">
    <xsl:copy>
      <xsl:apply-templates select="key('kB', 'RED')[position() &lt; 3]" />
    </xsl:copy>     
  </xsl:template>

  <xsl:template match="A">
    <D><xsl:value-of select="C" /></D>
  </xsl:template>

</xsl:stylesheet>

дает, с вашим вводом

<Root>
  <D>Baby</D>
  <D>Cola</D>
</Root>
1 голос
/ 23 июня 2011

Нет необходимости в итерации, просто примените шаблоны к необходимым элементам:

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="Root">
        <Root>
            <xsl:apply-templates select="A/B[
                .='RED' 
                and 
                count(../preceding-sibling::A[B='RED'])&lt;2]"/>
        </Root>     
    </xsl:template>


    <xsl:template match="B">
        <D>
            <xsl:value-of select="following-sibling::C"/>
        </D>
    </xsl:template>

</xsl:stylesheet>

При применении к вашему входу выдается:

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