2016-06-22 5 views
1

я работаю в XSLT 1.0 прямо сейчас, и у меня возникают проблемы группировки correctly.My XML не может быть изменен, и это выглядит следующим образом:XSLT Группирование Конкретные Siblings

<Analysis> 
    <comment>Test 1</comment> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <comment>Start 2nd Phase</comment> 
    <Action> 
    <Result>Failed</Result> 
    </Action> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <comment>Test 2</comment> 
    <Action> 
    <Result>Failed</Result> 
    </Action> 
    <Action> 
    <Result>Failed</Result> 
    </Action> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <comment>Start 2nd Phase</comment> 
    <Action> 
    <Result>Failed</Result> 
    </Action> 
    <comment>Start 3rd Phase</comment> 
    <Action> 
    <Result>Failed</Result> 
    </Action> 
    <comment>Test 3</comment> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <comment>Test 4</comment> 
    <Action> 
    <Result>Failed</Result> 
    </Action> 
    <Action> 
    <Result>Failed</Result> 
    </Action> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
    <comment>Start 2nd Phase</comment> 
    <Action> 
    <Result>Failed</Result> 
    </Action> 
    <Action> 
    <Result>Passed</Result> 
    </Action> 
</Analysis> 

код, который я в настоящее время будет печатать a Сбой, если он обнаружил ошибку под тестом, но он делает это только один раз. Однако сейчас это делается под каждым комментарием, а не с каждым комментарием, в котором есть «Тест».

<xsl:key name="actions" match="Action" use="generate-id(preceding-sibling::comment[1])" /> 

<xsl:template match="/Analysis"> 
    <table> 
     <xsl:for-each select="comment"> 
      <tr> 
       <td> 
        <xsl:if test="starts-with(text(),'Test')"> 
         <xsl:value-of select="."/> 
        </xsl:if> 
       </td> 
      </tr> 
      <xsl:if test="key('actions', generate-id())[Result='Failed']"> 
       <tr> 
        <td>Failed</td> 
       </tr> 
      </xsl:if> 
     </xsl:for-each> 
    </table> 
</xsl:template> 

Есть ли способ, чтобы сделать «предшествовавший-Sibling :: комментария [1]» работу только для комментариев, которые начинаются с «Test» или содержат «Тест»? Различное количество не важных комментариев, которые чередуются с важной информацией. Как и предыдущем примере, я хочу, чтобы увидеть выход, который был бы как

Test 1 
Failed 
Test 2 
Failed 
Test 3 
Test 4 
Failed 

Однако, с кодом я в настоящее время я получаю

Test 1 
Failed 
Test 2 
Failed 
Failed 
Failed 
Test 3 
Test 4 
Failed 
Failed 

Любая помощь будет оценена.

ответ

1

Вы должны быть в состоянии добавить предикат непосредственно к xsl:key ...

<xsl:key 
    name="actions" 
    match="Action" 
    use="generate-id(preceding-sibling::comment[starts-with(normalize-space(),'Test')][1])" 
/> 

Я также удалить xsl:if и поставить тест на xsl:for-each. Таким образом, вы не получите пустые строки для комментариев, которые вы хотите игнорировать.

Полный пример ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key 
    name="actions" 
    match="Action" 
    use="generate-id(preceding-sibling::comment[starts-with(normalize-space(),'Test')][1])" 
    /> 

    <xsl:template match="/Analysis"> 
    <table> 
     <xsl:for-each select="comment[starts-with(normalize-space(),'Test')]"> 
     <tr> 
      <td> 
      <xsl:value-of select="."/> 
      </td> 
     </tr> 
     <xsl:if test="key('actions', generate-id())[Result='Failed']"> 
      <tr> 
      <td>Failed</td> 
      </tr> 
     </xsl:if> 
     </xsl:for-each> 
    </table> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Это работало отлично, спасибо очень много. – Dschmied