2013-10-08 5 views
0

Первое сообщение после просмотра огромных предложений сообщества.Инкрементер в приглашениях для каждой группы

У меня есть три поля в XSLT 2.0, все на одном уровне (плечи, колени и пальцы на ногах). Мне нужно вывести суммы пальцев на основе уникальных комбинаций плеч и коленей, поэтому я создал две вложенные для каждой группы. На каждом выходе мне также нужно вывести инкремент от 1 до нескольких уникальных комбинаций плеч и колен.

Этот инкремент - это то место, где у меня возникают проблемы. Самое близкое, что я пришел, - это вызвать функцию position(), но если я назову ее в самой внутренней группе, счетчик сбрасывается на каждом уникальном плече. Если я назову это в самой внешней группе, каждое колено внутри уникального плеча получит то же значение, то оно сбрасывается на каждом уникальном плече. Если я назову его вне групп полностью, он никогда не пройдет. Я также пытался использовать xsl: число, ключи и т. Д., Но безрезультатно. В этом случае правильное количество строк все еще печатается, но значения приращения смотрят на отдельные, негрупповые значения.

Я прочитал одно предложение о «туннелировании» значений между шаблонами, но я не смог заставить это работать, главным образом потому, что я не думаю, что правильно вызываю шаблоны (с этими полями, уровень, а не родительский-ребенок). Любые мысли о том, как эта работа работает для каждой группы или иначе? Спасибо заранее.

Пример XML:

<bodies> 
<parts> 
    <shoulders>shoulders1</shoulders> 
    <knees>knees1</knees> 
    <toes>1</toes> 
</parts> 
<parts> 
    <shoulders>shoulders2</shoulders> 
    <knees>knees2</knees> 
    <toes>2</toes> 
</parts> 
<parts> 
    <shoulders>shoulders1</shoulders> 
    <knees>knees2</knees> 
    <toes>10</toes> 
</parts> 
<parts> 
    <shoulders>shoulders2</shoulders> 
    <knees>knees1</knees> 
    <toes>10</toes> 
</parts> 
<parts> 
    <shoulders>shoulders1</shoulders> 
    <knees>knees1</knees> 
    <toes>9</toes> 
</parts> 
<parts> 
    <shoulders>shoulders2</shoulders> 
    <knees>knees2</knees> 
    <toes>8</toes> 
</parts> 
</bodies> 

Пример XSLT:

<xsl:stylesheet exclude-result-prefixes="xsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:this="urn:this-stylesheet" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsl:template match="/"> 
     <xsl:for-each-group select="bodies/parts" group-by="shoulders"> 
     <xsl:for-each-group select="current-group()" group-by="knees"> 
      <xsl:value-of select="shoulders"/> 
      <xsl:text>, </xsl:text> 
      <xsl:value-of select="knees"/> 
      <xsl:text>, </xsl:text> 
      <xsl:value-of select="sum(current-group()/toes)"/> 
      <xsl:text>, </xsl:text> 
      <xsl:value-of select="position()"/> 
      <xsl:text>. </xsl:text> 
     </xsl:for-each-group> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

Результирующий выход:

shoulders1, knees1, 10, 1. shoulders1, knees2, 10, 2. shoulders2, knees2 , 10, 1. плечи2, колени1, 10, 2.

Желаемый результат:

shoulders1, knees1, 10, 1. shoulders1, knees2, 10, 2. shoulders2, knees2, 10, 3. shoulders2, knees1, 10, 4.

ответ

1

Когда у вас есть два вложенных xsl:for-each-group инструкции, как это, то альтернатива, чтобы сделать единый уровень группировки на составной ключе, как это:

<xsl:for-each-group select="bodies/parts" group-by="concat(shoulders, '~', knees)"> 

position() будет увеличивать путь вы ищете, если я правильно понял это требование.

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

0

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

<xsl:stylesheet exclude-result-prefixes="xsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:this="urn:this-stylesheet" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsl:template match="/"> 
    <xsl:variable name="results" as="xsd:string*"> 
     <xsl:for-each-group select="bodies/parts" group-by="shoulders"> 
     <xsl:for-each-group select="current-group()" group-by="knees"> 
      <xsl:value-of> 
      <xsl:value-of select="shoulders"/> 
      <xsl:text>, </xsl:text> 
      <xsl:value-of select="knees"/> 
      <xsl:text>, </xsl:text> 
      <xsl:value-of select="sum(current-group()/toes)"/> 
      <xsl:text>,</xsl:text> 
      </xsl:value-of> 
     </xsl:for-each-group> 
     </xsl:for-each-group> 
    </xsl:variable> 
    <xsl:for-each select="$results"> 
     <xsl:value-of select=".,position()"/> 
     <xsl:text>. </xsl:text> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы