xslt применять шаблоны в группе с помощью функции count - PullRequest
0 голосов
/ 01 февраля 2012

Количество элементов «can» в выходных данных должно быть равно количеству вхождений элемента «c» в элементе «a» во входном xml. Таким образом, первые последовательные вхождения элемента «can» должны быть равны 3 (так как первые последовательные вхождения элемента c под элементом a на входе равны 3), а следующий последовательный вхождение элементов «can» должно быть равно 2, как на входе. Однако в моем текущем выводе это повторяется в общей сложности (5). Я думаю, что нижняя строка должна быть изменена, но не уверен, как, попытался также использовать position (). То есть применять шаблоны только к c под первым (используя count ../) a, затем вторым a.

Строка, я полагаю, должна быть изменена

<xsl:apply-templates select="/*/*[$coun]/c"/>

Мой ввод xml

<Root>
  <a>
    <b>12</b>
    <c>1</c>
    <c>2</c>
    <c>3</c>
  </a>
  <a>
    <b>12</b>
    <c>a</c>
    <c>c</c>
  </a>
</Root>

Мой xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
      <Root>
      <xsl:apply-templates select="*/*/b"/>
      </Root>
    </xsl:template>
  <xsl:template match="b">
    <a>
      <xsl:value-of select="../b"/>
    </a>
    <xsl:variable name="coun">
      <xsl:value-of select="count(../preceding-sibling::a) + 1"/>
    </xsl:variable>
    <xsl:apply-templates select="/*/*[$coun]/c"/>
  </xsl:template>
  <xsl:template match="c">
    <can>abc</can>
  </xsl:template>
</xsl:stylesheet>

мой токовый выход

<Root>
  <a>12</a>
  <can>abc</can>
  <can>abc</can>
  <can>abc</can>
  <can>abc</can>
  <can>abc</can>
  <a>12</a>
  <can>abc</can>
  <can>abc</can>
  <can>abc</can>
  <can>abc</can>
  <can>abc</can>
</Root>

мой ожидаемый результат

<Root>
  <a>12</a>
  <can>abc</can>
  <can>abc</can>
  <can>abc</can>
  <a>12</a>
  <can>abc</can>
  <can>abc</can>
</Root>

1 Ответ

4 голосов
/ 01 февраля 2012

Введите:

<Root>
  <a>
    <b>12</b>
    <c>1</c>
    <c>2</c>
    <c>3</c>
  </a>
  <a>
    <b>12</b>
    <c>a</c>
    <c>c</c>
  </a>
</Root>

XSLT:

<xsl:template match='b'>
    <a>
        <xsl:value-of select='.'/>
    </a>
</xsl:template>

<xsl:template match='c'>
    <can>abc</can>
</xsl:template>

<xsl:template match='/Root'>
    <Root>
        <!-- select all 'b' and 'c' elements within an 'a' element -->
        <xsl:apply-templates select='a/b | a/c'/>
    </Root>
</xsl:template>

Выход:

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