【问题标题】:XSLT Grouping Specific SiblingsXSLT 对特定同级进行分组
【发布时间】:2016-10-24 21:01:05
【问题描述】:

我现在正在使用 XSLT 1.0,但无法正确分组。我的 xml 无法更改,它看起来像:

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

如果在测试下发现失败,我目前拥有的代码将打印失败,但它只执行一次。但是,现在它在每条评论下方执行此操作,而不是在其中包含“测试”的每条评论。

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

有没有办法使“preceding-sibling::comment[1]”仅适用于以“Test”开头或包含“Test”的 cmets?有不同数量的不重要的 cmets 穿插着重要的信息。与上面的示例一样,我希望看到类似于

的输出
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 

任何帮助将不胜感激。

【问题讨论】:

    标签: xml xslt xslt-1.0 xslt-grouping


    【解决方案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 上。这样你就不会得到你想忽略的 cmets 的空白行。

    完整示例...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      相关资源
      最近更新 更多