Оберните два узла значениями больше 0 с помощью div - PullRequest
2 голосов
/ 26 января 2012

Мне нужно преобразовать следующий xml с xslt

<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>0</item>
<item>6</item>

в следующий html

<div>
  <i>1</i> 
  <i>2</i>
</div>

<div>
  <i>3</i> 
  <i>6</i>
</div>

Другими словами, чтобы удалить узлы со значением 0 и обернуть каждые 2 узлаодин div

1 Ответ

3 голосов
/ 26 января 2012

Я бы сделал это так:

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

<xsl:param name="value" select="0"/>

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="root">
  <xsl:copy>
    <xsl:apply-templates select="item[not(. = $value)][position() mod 2 = 1]" mode="group"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="item" mode="group">
  <div>
    <xsl:apply-templates select=". | following-sibling::item[not(. = $value)][1]"/>
  </div>
</xsl:template>

</xsl:stylesheet>

затем с вводом

<root>
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>0</item>
<item>6</item>
</root>

вы получите результат

<root>
   <div>
      <item>1</item>
      <item>2</item>
   </div>
   <div>
      <item>3</item>
      <item>6</item>
   </div>
</root>

Если вы также хотите преобразовать элементы item в i, просто добавьте шаблон

<xsl:template match="item">
  <i>
    <xsl:apply-templates/>
  </i>
</xsl:template>

в таблице стилей.

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