2015-03-19 2 views
1

У меня возникли проблемы с выражением XPath, которые помогут мне создать оглавление из Excel XML.Помощь XSL XPath, когда следующие братья и сестры содержат 2 дочерних элемента

Вот моя основная структура Excel XML:

<Table> 
<Row> 
    <Cell> 
     <Data ss:Type="String">Title 1</Data> 
    </Cell> 
</Row> 
<Row> 
    <Cell ss:Index="2"> 
     <Data ss:Type="String">Subtitle1</Data> 
    </Cell> 
    <Cell> 
     <Data ss:Type="String">Filename1</Data> 
    </Cell> 
</Row> 
<Row> 
    <Cell ss:Index="2"> 
     <Data ss:Type="String">Subtitle2</Data> 
    </Cell> 
    <Cell> 
     <Data ss:Type="String">Filename2</Data> 
    </Cell> 
</Row> 
<Row> 
    <Cell ss:Index="2"> 
     <Data ss:Type="String">Subtitle3</Data> 
    </Cell> 
    <Cell> 
     <Data ss:Type="String">Filename3</Data> 
    </Cell> 
</Row> 
<Row> 
    <Cell> 
     <Data ss:Type="String">Title 2</Data> 
    </Cell> 
</Row> 
<Row> 
    <Cell ss:Index="2"> 
     <Data ss:Type="String">Subtitle1</Data> 
    </Cell> 
    <Cell> 
     <Data ss:Type="String">Filename1</Data> 
    </Cell> 
</Row> 
<Row> 
    <Cell ss:Index="2"> 
     <Data ss:Type="String">Subtitle2</Data> 
    </Cell> 
    <Cell> 
     <Data ss:Type="String">Filename2</Data> 
    </Cell> 
</Row> 
<Row> 
    <Cell ss:Index="2"> 
     <Data ss:Type="String">Subtitle3</Data> 
    </Cell> 
    <Cell> 
     <Data ss:Type="String">Filename3</Data> 
    </Cell> 
</Row> 
<Row> 
    <Cell ss:Index="2"> 
     <Data ss:Type="String">Subtitle4</Data> 
    </Cell> 
    <Cell> 
     <Data ss:Type="String">Filename4</Data> 
    </Cell> 
</Row> 

Как было показано выше, у меня есть два названия, каждая из которых один элемент Cell, и мне нужно, чтобы быть в состоянии захватить следующие братья и сестры которые содержат два элемента ячейки. Мне нужно выход выглядеть следующим образом:

<ul class="nav"> 
    <li class="sub"> 
    <a href="javascript:void(0);">Title 1</a> 
    <ul> 
     <li> 
      <a href="javascript:void(0);" data-src="Filename1">Subtitle1</a> 
     </li> 
     <li> 
      <a href="javascript:void(0);" data-src="Filename2">Subtitle2</a> 
     </li> 
     <li> 
      <a href="javascript:void(0);" data-src="Filename3">Subtitle3</a> 
     </li> 
    </ul> 
    </li> 
    <li class="sub"> 
    <a href="javascript:void(0);">Title 2</a> 
    <ul> 
     <li> 
      <a href="javascript:void(0);" data-src="Filename1">Subtitle1</a> 
     </li> 
     <li> 
      <a href="javascript:void(0);" data-src="Filename2">Subtitle2</a> 
     </li> 
     <li> 
      <a href="javascript:void(0);" data-src="Filename3">Subtitle3</a> 
     </li> 
     <li> 
      <a href="javascript:void(0);" data-src="Filename4">Subtitle4</a> 
     </li> 
    </ul> 
    </li> 
</ul> 

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

+1

Вы можете использовать XSLT 2.0 для этого? –

+0

К сожалению, нет. Благодаря! – zedkineece

ответ

2

XSLT 1.0 решение

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output indent="yes"/> 

    <xsl:template match="Table"> 
     <ul class="nav"> 
      <xsl:apply-templates select="Row[count(Cell)=1]"/> 
     </ul> 
    </xsl:template> 

    <xsl:template match="Row[count(Cell)=1]"> 
     <li class="sub"> 
      <a href="javascript:void(0);"><xsl:value-of select="Cell/Data"/></a> 
      <ul> 
       <xsl:variable name="heading" select="."/> 
       <xsl:apply-templates 
         select="following-sibling::Row[Cell[2]] 
           [generate-id(preceding-sibling::Row[count(Cell)=1][1]) = 
               generate-id($heading)]"/> 
      </ul> 
     </li> 
    </xsl:template> 

    <xsl:template match="Row[Cell[2]]"> 
     <li> 
      <a href="javascript:void(0);" data-src="{ Cell[2]/Data }"> 
       <xsl:value-of select="Cell[1]/Data"/> 
      </a> 
     </li> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Очень приятно, Безумие! Я не знал о возможности сопоставления в формате «Row [count (Cell) = 1». Супер ценит руководство. – zedkineece

+0

Я хочу уточнить, что третий шаблон data-src и значение тега привязки меняются на противоположные (для тех, кто ищет аналогичное решение). – zedkineece

+1

Упс! Я скорректировал XPath, чтобы выбрать соответствующие значения для '@ data-src' и якорный текст. –

2

И это еще один способ (скопированный ответ Мадс Хансен «s) с помощью xsl:key:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes" method="xml"/> 

    <xsl:key name="element" match="Row[Cell[2]]" use="generate-id(preceding::Row[count(Cell) = 1][1])"/> 

    <xsl:template match="Table"> 
     <ul class="nav"> 
      <xsl:apply-templates select="Row[count(Cell)=1]"/> 
     </ul> 
    </xsl:template> 

    <xsl:template match="Row[count(Cell)=1]"> 
     <li class="sub"> 
      <a href="javascript:void(0);"> 
       <xsl:value-of select="Cell/Data"/> 
      </a> 
      <ul> 
       <xsl:apply-templates select="key('element', generate-id())"/> 
      </ul> 
     </li> 
    </xsl:template> 

    <xsl:template match="Row[Cell[2]]"> 
     <li> 
      <a href="javascript:void(0);" data-src="{ Cell[2]/Data }"> 
       <xsl:value-of select="Cell[1]/Data"/> 
      </a> 
     </li> 
    </xsl:template> 

</xsl:stylesheet> 
Смежные вопросы