XSL найти строку и начать с этого момента - PullRequest
3 голосов
/ 07 сентября 2011

Извините, но мои знания xsl не фантастические.
У меня есть некоторый код для построения таблицы из 3 столбцов с различным числом узлов:

<xsl:variable name="t-size" select="count(NewDataSet/VehicleDetail/Options/Option)"/>
   <xsl:variable name="myCount" select="ceiling($t-size div 3)"/>
   <table callpadding="4" cellspacing="0" border="0" id="specificationTbl">
   <xsl:for-each select="NewDataSet/VehicleDetail/Options/Option[position() &lt;= $myCount]">
      <xsl:variable name="here" select="position()"/>
         <tr>
           <td class="stiDetail"><xsl:value-of select="."/></td>
           <td class="stiDetail"><xsl:choose>
               <xsl:when test="../Option[$here+$myCount]">
                  <xsl:value-of select="../Option[$here+$myCount]/."/>
               </xsl:when>
               <xsl:otherwise>
               </xsl:otherwise>
               </xsl:choose>
           </td>
           <td class="stiDetail"><xsl:choose>
               <xsl:when test="../Option[$here+$myCount+$myCount]">
                  <xsl:value-of select="../Option[$here+$myCount+$myCount]/."/>
               </xsl:when>
               <xsl:otherwise>
               </xsl:otherwise>
               </xsl:choose></td>
         </tr>
       </xsl:for-each>
   </table></td>

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

EG. Вот пример XML

<options>
  <option>something</option>
  <option>something</option>
  <option>something</option>
  <option>something</option>
  <option>hello world</option>
  <option>something</option>
  <option>something</option>
  <option>something</option>
  <option>something</option>
  <option>something</option>
  <option>something</option>
</options>

Итак, в приведенном выше xml я хотел бы найти узел, содержащий слово «мир», а затем начать создание таблицы со следующего узла IE. с позиции 6 и далее.

Надеюсь, что это имеет смысл.

Любая помощь будет принята с благодарностью.

Большое спасибо,

Энди.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2011

Использование :

/*/*[(.|preceding-sibling::*)[contains(text(),'world')]]

Это выражение XPath, вероятно, является самым коротким, которое выбирает именно нужный набор элементов.

Проверка на основе XSLT :

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

 <xsl:template match="/">
     <xsl:copy-of select=
      "/*/*[(.|preceding-sibling::*)[contains(.,'world')]]"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу :

<options>
    <option>something</option>
    <option>something</option>
    <option>something</option>
    <option>something</option>
    <option>hello world</option>
    <option>something</option>
    <option>something</option>
    <option>something</option>
    <option>something</option>
    <option>something</option>
    <option>something</option>
</options>

желаемый, правильный результат получается :

<option>hello world</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>

В качестве альтернативы вы можете получить это преобразование :

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

 <xsl:template match="*[(.|preceding-sibling::*)[contains(text(),'world')]]">
     <xsl:copy-of select="."/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>
0 голосов
/ 07 сентября 2011
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

    <xsl:template match="/options">
        <table>
            <xsl:apply-templates select="option[contains(., 'world')] | option[contains(., 'world')]/following-sibling::option"/>
        </table>
    </xsl:template>

    <xsl:template match="option">
        <tr>
            <td>
                <xsl:value-of select="."/>
            </td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

Выход:

<table>
  <tr>
    <td>hello world</td>
  </tr>
  <tr>
    <td>something</td>
  </tr>
  <tr>
    <td>something</td>
  </tr>
  <tr>
    <td>something</td>
  </tr>
  <tr>
    <td>something</td>
  </tr>
  <tr>
    <td>something</td>
  </tr>
  <tr>
    <td>something</td>
  </tr>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...