首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在xslt中按子字符串选择分组节点

如何在xslt中按子字符串选择分组节点
EN

Stack Overflow用户
提问于 2014-09-12 17:31:48
回答 2查看 354关注 0票数 0

我有这个xml源文件

代码语言:javascript
复制
<TestRun>
  <Results>
    <UnitTestResult testId="1f32f6b9-6623-1321-32b5-b2e84ef44f61" testName="TestMethod1" outcome="Passed">
      <Output>
        <TextMessages>
          <Message>__OWNER__='Team-2' some other stuff1</Message>
        </TextMessages>
      </Output>
    </UnitTestResult>
    <UnitTestResult testId="1f32f6b9-6623-1321-32b5-b2e84ef44f62" testName="TestMethod2" outcome="Failed">
      <Output>
        <TextMessages>
          <Message>__OWNER__='Team-1' some other stuff2</Message>
        </TextMessages>
      </Output>
    </UnitTestResult>
    <UnitTestResult testId="1f32f6b9-6623-1321-32b5-b2e84ef44f63" testName="TestMethod3" outcome="Failed">
      <Output>
        <TextMessages>
          <Message>__OWNER__='Team-1' some other stuff 3</Message>
        </TextMessages>
      </Output>
    </UnitTestResult>
    <UnitTestResult testId="1f32f6b9-6623-1321-32b5-b2e84ef44f64" testName="TestMethod4" outcome="Failed">
      <Output>
        <TextMessages>
          <Message>__OWNER__='Team-2' some other stuff 4</Message>
        </TextMessages>
      </Output>
    </UnitTestResult>
  </Results>
</TestRun>

我需要按所有者对失败的测试进行分组,这是消息节点的子字符串。

所以结果应该是

代码语言:javascript
复制
<TestResults>
  <Owner name="Team-1">
    <TestMethod name="TestMethod2"/>
    <TestMethod name="TestMethod3"/>
  </Owner>
  <Owner name="Team-2">
    <TestMethod name="TestMethod4"/>
  </Owner>

有什么想法可以做到这一点(最好使用XSLT 1.0 )?

EN

回答 2

Stack Overflow用户

发布于 2014-09-12 17:41:20

有关XSLT1.0中的分组,请参阅:http://www.jenitennison.com/xslt/grouping/muenchian.html

--

为响应您的编辑而编辑的

要按子字符串分组,您可以将密钥定义为:

代码语言:javascript
复制
<xsl:key name="result" match="UnitTestResult" use="substring-before(substring-after(Output/TextMessages/Message, $apos), $apos)" />

其中,$apos定义为:

代码语言:javascript
复制
<xsl:variable name="apos">'</xsl:variable>
票数 1
EN

Stack Overflow用户

发布于 2014-09-12 19:21:54

我得到的用双引号(不是单引号)引起来的团队名称的草案版本输出不是xml,而是纯文本。但是,脚本会进行分组。

代码语言:javascript
复制
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" indent="yes" omit-xml-declaration="yes" />
  <xsl:strip-space elements="*" />
  <xsl:variable name="apos">'</xsl:variable>
  <xsl:key name="owner-by-name" match="UnitTestResult[@outcome='Failed']"
           use="substring-before(substring-after(Output/TextMessages/Message,'__OWNER__=&quot;'),'&quot;')" />
  <xsl:template match="*/text()" />
  <xsl:template match="TestRun/Results">
    <xsl:for-each
      select="UnitTestResult[generate-id(.)=generate-id(key('owner-by-name',substring-before(substring-after(Output/TextMessages/Message,'__OWNER__=&quot;'),'&quot;'))[1])]">
      <xsl:text>&#xa;</xsl:text>
      <xsl:text>&#xa;</xsl:text>
      <xsl:value-of
        select="substring-before(substring-after(Output/TextMessages/Message,'__OWNER__=&quot;'),'&quot;')" />
      <xsl:text>&#xa;------------------------------------</xsl:text>
      <xsl:for-each
        select="key('owner-by-name', substring-before(substring-after(Output/TextMessages/Message,'__OWNER__=&quot;'),'&quot;'))">
        <xsl:text>&#xa;</xsl:text>
        <xsl:value-of select="@testName" />
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25805112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档