首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据ID条目对.xml文件和合并部分进行排序

如何根据ID条目对.xml文件和合并部分进行排序
EN

Stack Overflow用户
提问于 2017-03-31 15:00:43
回答 1查看 65关注 0票数 0

我有一个.xml文件,其中包含两组信息,我想根据它们的ID值(1.2)相互匹配。例如,这个片段。

代码语言:javascript
复制
<rule id="1.2">
      <checker id="checker.id">
         <description locale="en">description</description>
      </checker>
</rule>

<rule id="1.2">
        <checker>
            <category locale="en">Advisory</category>
            <decidable locale="en">Yes</decidable>
        </checker>  
</rule>    

我对每个规则都有一个.xsl,将这些值添加到表条目中

代码语言:javascript
复制
<row>
    <entry>
        <xsl:value-of select="@id"/>                                                                    
    </entry>
    <entry>
        <xsl:for-each select="checker">
        <xsl:value-of select="category[@locale=$locale]"/>
        </xsl:for-each>
    </entry>
    <entry>
        <xsl:for-each select="checker">
        <xsl:value-of select="decidable[@locale=$locale]"/>
        </xsl:for-each>
    </entry>
    <entry>
        <xsl:for-each select="checker">
        <p>
        <codeph>
        <xsl:value-of select="@id"/></codeph><xsl:text>&#160;</xsl:text>
        <xsl:value-of select="description[@locale=$locale]"/>
        </p>
        </xsl:for-each>                                   
    </entry>                                    
</row>  

当前的结果给出了这个结果,但是它已经创建了两个单独的行,尽管ID是相同的。如何才能使ID相同的信息在同一行中?

代码语言:javascript
复制
<row>
    <entry>1.2</entry>
    <entry>Advisory</entry>
    <entry>Yes</entry>
    <entry>
    <p>
    <codeph/></p>
    </entry>
</row>
<row>
    <entry>1.2</entry>
    <entry/>
    <entry/>
    <entry>
    <p>
    <codeph>checker.id</codeph>description</p>
    </entry>
</row>

预期结果:

代码语言:javascript
复制
<row>
    <entry>1.2</entry>
    <entry>Advisory</entry>
    <entry>Yes</entry>
    <entry>
    <p><codeph>checker.id</codeph>description</p>
    </entry>
</row>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-31 19:58:41

这是所谓Muenchian grouping的变体.

下面的XSLT选择所有<rule>s的排序<rule>的第一个匹配,然后通过将//运算符与谓词相匹配,将所有<rule>与相同的@id匹配,从而编译所需的结果。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:key name="kSorted" match="rule" use="@id" />
  <xsl:variable name="locale" select="'en'" />

    <xsl:template match="/root">
      <xsl:apply-templates select="rule[generate-id() = generate-id(key('kSorted',@id)[1])]">
        <xsl:sort select="@id" />
      </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="rule">
      <xsl:variable name="thisID" select="@id" />
      <row>
        <entry><xsl:value-of select="@id"/></entry>
        <entry><xsl:value-of select="//rule[@id = $thisID]//category[@locale=$locale]"/></entry>
        <entry><xsl:value-of select="//rule[@id = $thisID]//decidable[@locale=$locale]"/></entry>
        <entry>
          <p>
            <codeph><xsl:value-of select="checker/@id"/></codeph><xsl:text>&#160;</xsl:text>
            <xsl:value-of select="checker/*[@locale=$locale][1]"/>
          </p>
        </entry>                                    
      </row> 
    </xsl:template>

</xsl:stylesheet>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43143836

复制
相关文章

相似问题

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