Группировка в XSLT - PullRequest
       13

Группировка в XSLT

0 голосов
/ 16 марта 2012

Иметь исходный XML:

<root>
      <element Key="card1_id">123</element>
      <element Key="card1_balance">500</element>
      <element Key="card2_id">456</element>
      <element Key="card2_balance">800</element>
      .............................................
      <element Key="card(n)_id">999</element>
      <element Key="card(n)_balance">8000</element>
</root>

Где n - количество карточек

С XSLT мне нужно получить HTML:

<b>Card 1:</b>   
  ID: 123 <br/> 
  Balance: 500 <br/>  

<b>Card 2:</b>   
  ID: 456<br/>  
  Balance: 800<br/> 
 ..................
<b>Card n:</b>   
  ID: 999<br/>  
  Balance: 8000<br/>

Какорганизовать такую ​​группировку?

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Использовать Muechian группирование с XSLT 1.0:

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

  <xsl:key name="k1" match="element" use="translate(@Key, translate(@Key, '0123456789', ''), '')"/>

  <xsl:output method="html" indent="yes"/>

  <xsl:template match="root">
    <div>
      <xsl:apply-templates select="element[generate-id() = generate-id(key('k1', translate(@Key, translate(@Key, '0123456789', ''), ''))[1])]" mode="group"/>
    </div>
  </xsl:template>

  <xsl:template match="element" mode="group">
    <b>Card <xsl:value-of select="translate(@Key, translate(@Key, '0123456789', ''), '')"/>:</b>
    <xsl:apply-templates select="key('k1', translate(@Key, translate(@Key, '0123456789', ''), ''))"/>
  </xsl:template>

  <xsl:template match="element">
    <xsl:value-of select="concat(substring-after(., '_'), ': ', .)"/>
    <br/>
  </xsl:template>

</xsl:stylesheet>

С этой таблицей стилей Saxon 6.5.5 преобразует

<root>
      <element Key="card1_id">123</element>
      <element Key="card1_balance">500</element>
      <element Key="card2_id">456</element>
      <element Key="card2_balance">800</element>
      .............................................
      <element Key="card3_id">999</element>
      <element Key="card3_balance">8000</element>
</root>

в

<div><b>Card 1:</b>: 123<br>: 500<br><b>Card 2:</b>: 456<br>: 800<br><b>Card 3:</b>: 999<br>: 8000<br></div>
1 голос
/ 16 марта 2012

Вы не говорите, используете ли вы XSLT 1.0 или 2.0.

Кроме того, вам не нужно группировать как таковые, чтобы получить результат.

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

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

<xsl:output method="html"/>

<xsl:template match="/root/element[ends-with(@Key,'id')]">
 <b><xsl:value-of select="replace(@Key,'(.*)(\d.*)_id','$1 $2:')"/></b>   
  ID: <xsl:value-of select="."/> <br/> 
  Balance: <xsl:value-of select="following-sibling::element"/> <br/>
</xsl:template>

<xsl:template match="element"/>

</xsl:stylesheet>
...