Использование позиции для подсчета узлов - иногда перечисление начинается с 0 вместо 1 - PullRequest
0 голосов
/ 17 мая 2011

Эй, ребята, У меня есть этот довольно неуклюжий кусок xslt, который я использую для преобразования тестовых случаев SOAPUI в более читаемый формат. В настоящее время он перечисляет тестовые случаи, используя следующее

<xsl:value-of select="position()-3"/>

Мой вопрос Иногда перечисление тестового примера начинается с 0, а иногда с 1. Я не понимаю, почему это происходит? Это как-то связано с тем, как реализован селектор положения? Есть ли более аккуратный способ подсчета экземпляров узла?

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

Richard

Вот код целиком - без стиля.

`

  <!-- Edited by XMLSpy® -->
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:con="http://eviware.com/soapui/config">
    <xsl:output method="html" encoding ="utf-8"/>
    <xsl:template match="/">
      <html>
        <head>
          <script type="text/javascript">
            function toggleDiv(divid){
                var ele = document.getElementById(divid);

                if(ele.style.display == 'none')
                    { 
                        ele.style.display = 'block';
                    }
                else
                    {
                        ele.style.display = 'none';
                    }
                }
          </script>  

            <style type="text/css"></style>

        </head>

        <body>

          <xsl:apply-templates/>

          <div class="help">This report is generated automatically by a scheduled job running on Richard Fortune's machine. The SOAPUI project files it references are located in sourcecontrol SVN (https://svn.xxx.xxxxxx.com/svn/network/TEST). These reports are generated daily as the projects they reference are subject to change.</div>

        </body>
      </html>

    </xsl:template>

    <xsl:template match="con:soapui-project">
     <div><h1>Project Name : <xsl:value-of select="@name"/></h1></div> 
      <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="con:testSuite">    

    <xsl:if test="con:description=''">
                <p class="warn"> (RICHARD - PLEASE PROVIDE A DESCRIPTION!!)</p>
    </xsl:if>       
      <div id="content" onmousedown="toggleDiv('{position()}');"><h2 class="ex">TestSuite:  <xsl:value-of select="@name"/></h2></div>
      <br>
        <p class="descSuite"><b>Suite Description: </b><xsl:value-of select="con:description"/></p>
      </br>

      <div style="display:none" id="{position()}"><xsl:apply-templates />
      </div>
    </xsl:template>


    <xsl:template match="con:testCase">

        <ul>
          <li class="tc"><b>
            (#<xsl:value-of select="position()-3"/>) Testcase: </b><xsl:value-of select="@name"/>
          </li>

          <xsl:if test="con:description=''">
            <p class="warn">(Gentle reminder Richard - PLEASE PROVIDE A DESCRIPTION!!)</p>
          </xsl:if>

          <p class="descTc">
            <strong><i>Description:</i></strong> <xsl:value-of select="con:description"/>
          </p>
          <ol class="step">
          <xsl:for-each select="con:testStep"><li>TestStep: <xsl:value-of select="@name"/> </li></xsl:for-each>
          </ol>

        </ul>
        <xsl:apply-templates />

    </xsl:template>


    <xsl:template match="*"></xsl:template>


  </xsl:stylesheet>

`

Ответы [ 3 ]

2 голосов
/ 17 мая 2011

Я предлагаю вам использовать count():

<xsl:value-of select="count(preceding-sibling::*)+1"/>

Возвращает текущую позицию узла относительно всех его родственных элементов (на основе 1).

position() может быть неправильным способом в зависимости от контекста.

1 голос
/ 17 мая 2011

Вот как вы бы использовали <xsl:number>, что более эффективно, чем count():

<li class="tc">
  <b>(#<xsl:number/>) Testcase: </b><xsl:value-of select="@name"/>
</li>

Это так просто! По умолчанию <xsl:number> подсчитывает узлы одного и того же вида (в данном случае, элементов) и с тем же именем элемента, что и у контекстного узла ... это то, что вы хотите здесь, я считаю. Таким образом, он будет насчитывать <con:testCase> элементов.

1 голос
/ 17 мая 2011

Проблема с position() в том, что он может (и часто включает) узлы, которые вы не ожидаете, такие как текстовые или даже пробельные узлы, если что-либо прочитавшее XML сохранило его.

В зависимости от ваших точных требований, вы можете сосчитать количество предшествующих братьев и сестер (как описано в @empo), или, возможно, стоит взглянуть на инструкцию <xsl:number>.

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