XSL找到一个字符串并从那一点开始

时间:2011-09-07 12:26:06

标签: xml xslt xpath

对此抱歉,但我对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中,我想扫描包含单词“world”的节点,然后从以下节点IE开始创建表。从第6位开始。

希望这是有道理的。

非常感谢任何帮助。

非常感谢,

安迪。

2 个答案:

答案 0 :(得分:0)

<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>

答案 1 :(得分:0)

使用

/*/*[(.|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>