2013-03-26 3 views
0
<Sections> 
    <Products> 
     <Transport> 
     <TransportSequence>1</TransportSequence> 
     <Traveller>001</Traveller> 
     </Transport> 
     <Transport> 
     <TransportSequence>2</TransportSequence> 
     <Traveller>001</Traveller> 
     </Transport> 
    </Products> 
    </Sections> 
    <Sections> 
    <Products> 
     <Transport> 
     <TransportSequence>1</TransportSequence> 
     <Traveller>002</Traveller> 
     </Transport> 
     <Transport> 
     <TransportSequence>2</TransportSequence> 
     <Traveller>002</Traveller> 
     </Transport> 
    </Products> 
    </Sections> 

У меня есть особая проблема с заказом некоторого XML. В приведенном выше примере мне нужно изменить формат, чтобы я выделял только отдельные значения в TransportSequence. Затем мне нужно назначить узлы любого 'путешественника, как дети, чтобы произвести что-то вроде этого:XSLT Трансформирование: выберите отдельную группу и группу appendchild

<Sections> 
    <Products> 
     <Transport> 
     <TransportSequence>1</TransportSequence> 
     <Travellers> 
      <Traveller>001</Traveller> 
      <Traveller>002</Traveller> 
     </Travellers> 
     </Transport> 
     <Transport> 
     <TransportSequence>2</TransportSequence> 
     <Travellers> 
      <Traveller>001</Traveller> 
      <Traveller>002</Traveller> 
     </Travellers> 
     </Transport> 
    </Products> 
</Sections> 

Другая проблема заключается в том, что в узле транспорта также содержит много детей и внуков узлы, не показанные в этом примере. Также может быть много travllers, принадлежащих к TravellerSequence. Существует также множество номеров TransportSequence.

+0

Вы хотите использовать XSLT 1.0 или 2.0? Группировка проще в XSLT 2.0 с 'for-each-group'. –

ответ

0

Вот XSLT 2.0 таблицы стилей, которые будут работать с XSLT процессоры 2.0, такие как Saxon 9 или AltovaXML:

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

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

<xsl:template match="*[Sections]"> 
    <xsl:copy> 
    <Sections> 
     <Products> 
     <xsl:for-each-group select="Sections/Products/Transport" group-by="TransportSequence"> 
      <Transport> 
      <TransportSequence><xsl:value-of select="current-grouping-key()"/></TransportSequence> 
      <Travellers> 
       <xsl:copy-of select="current-group()/Traveller"/> 
      </Travellers> 
      </Transport> 
     </xsl:for-each-group> 
     </Products> 
    </Sections> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Он трансформирует

<Root> 
<Sections> 
    <Products> 
     <Transport> 
     <TransportSequence>1</TransportSequence> 
     <Traveller>001</Traveller> 
     </Transport> 
     <Transport> 
     <TransportSequence>2</TransportSequence> 
     <Traveller>001</Traveller> 
     </Transport> 
    </Products> 
    </Sections> 
    <Sections> 
    <Products> 
     <Transport> 
     <TransportSequence>1</TransportSequence> 
     <Traveller>002</Traveller> 
     </Transport> 
     <Transport> 
     <TransportSequence>2</TransportSequence> 
     <Traveller>002</Traveller> 
     </Transport> 
    </Products> 
    </Sections> 
</Root> 

в

<Root> 
    <Sections> 
     <Products> 
     <Transport> 
      <TransportSequence>1</TransportSequence> 
      <Travellers> 
       <Traveller>001</Traveller> 
       <Traveller>002</Traveller> 
      </Travellers> 
     </Transport> 
     <Transport> 
      <TransportSequence>2</TransportSequence> 
      <Travellers> 
       <Traveller>001</Traveller> 
       <Traveller>002</Traveller> 
      </Travellers> 
     </Transport> 
     </Products> 
    </Sections> 
</Root> 

[править] Чтобы завершить ответ, если вы хотите использовать процессор XSLT 1.0, решение, использующее группировку Muenchian, выглядит s следует:

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

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

<xsl:key name="by-seq" match="Sections/Products/Transport" use="TransportSequence"/> 

<xsl:template match="*[Sections]"> 
    <xsl:copy> 
    <Sections> 
     <Products> 
     <xsl:for-each select="Sections/Products/Transport[generate-id() = generate-id(key('by-seq', TransportSequence)[1])]"> 
      <Transport> 
      <xsl:copy-of select="TransportSequence"/> 
      <Travellers> 
       <xsl:copy-of select="key('by-seq', TransportSequence)/Traveller"/> 
      </Travellers> 
      </Transport> 
     </xsl:for-each> 
     </Products> 
    </Sections> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

Большое спасибо, это указывает на меня в правильном направлении и решило массу проблем. – BerZerK

 Смежные вопросы

  • Нет связанных вопросов^_^