我想根据子标签From Tag对父节点CommlCoverage进行排序

时间:2014-01-29 08:18:09

标签: xslt

我们希望xsl-sort来自

中的元素
<?xml version="1.0"?>
<General><CommlCoverage>
    <Audit>
            <AuditMtc>
                    <Term>
                            <From>2013-07-05</From>
                            <To>2014-06-02</To>
                    </Term>
            </AuditMtc>
    </Audit>
    <Supplement>
            <Audit>
                    <AuditMtc>
                            <Term>
                                    <From>2013-07-02</From>
                                    <To>2014-06-02</To>
                            </Term>
                    </AuditMtc>
            </Audit>
    </Supplement>
    <Supplement>
            <Audit>
                    <AuditMtc>
                            <Term>
                                    <From>2013-01-02</From>
                                    <To>2014-06-02</To>
                            </Term>
                    </AuditMtc>
            </Audit>
    </Supplement>
</CommlCoverage>    
<CommlCoverage>
<Audit>
<AuditMtc><Term><From>2013-07-05</From><To>2014-06-02</To></Term></AuditMtc></Audit>
<Supplement><Audit><AuditMtc><Term><From>2013-07-02</From><To>2014-06-02</To></Term></AuditMtc></Audit></Supplement>
</CommlCoverage></General>

需要基于日期排序第一个标签审核具有不同结构与日期第二个补充标签具有不同结构和不同日期 我的代码:

            <xsl:for-each select="CommlCoverage">
            <xsl:sort select="From"/>
            <xsl:for-each select="Audit">
                <xsl:value-of select="AuditMtc/Term/From"/>
            </xsl:for-each>
            <xsl:for-each select="Supplement/Audit">
                <xsl:value-of select="AuditMtc/Term/From"/>
            </xsl:for-each>
        </xsl:for-each>
We have update the desired output:
[2013-01-02 To 2014-06-02]
[2013-01-02 To 2014-06-02]
[2013-07-02 To 2014-06-02] [2013-07-02 To 2014-06-02] [2013-07-05 To 2014-06-02] [2013-07-05 To 2014-06-02]

2 个答案:

答案 0 :(得分:0)

您可能会开始使用模板来匹配根元素

<xsl:template match="/*">

在此范围内,您只需按照发件人日期的顺序选择期限子项,这可能处于不同级别。 (这假设 From 元素始终是 Term

的直接子元素
 <xsl:apply-templates select=".//Term">
    <xsl:sort select="From" />
 </xsl:apply-templates>

请注意,语法.//Term将在当前节点下方的层次结构中的任何级别搜索 Term 元素。

然后,您只需要一个模板来匹配 Term 元素,并输出 From To 值,就像这样

  <xsl:template match="Term">
    [<xsl:value-of select="From"/> to <xsl:value-of select="To" />]
  </xsl:template>

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" />

  <xsl:template match="/*">
      <xsl:apply-templates select=".//Term">
         <xsl:sort select="From" />
      </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="Term">
    [<xsl:value-of select="From"/> to <xsl:value-of select="To" />]
  </xsl:template>
</xsl:stylesheet>

这输出以下内容:

[2013-01-02 to 2014-06-02]
[2013-07-02 to 2014-06-02]
[2013-07-02 to 2014-06-02]
[2013-07-05 to 2014-06-02]
[2013-07-05 to 2014-06-02]

(这与您的预期输出不完全匹配,因为您的预期输出会显示六批From和To时间,但输入中只有五个。)

答案 1 :(得分:0)

不确定我是否对该要求是正确的,但是,这是以下代码的作用: 根据任何// Term / From对“CommlCoverage”进行排序,然后按排序顺序写入所有// Term / From。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" indent="yes"/>
<xsl:template match="/General">
    <xsl:for-each select="CommlCoverage">
        <xsl:sort>
            <xsl:for-each select="current()//Term/From">
                <xsl:sort select="."/>
                <xsl:if test="position() = 1">
                    <xsl:value-of select="."/>
                </xsl:if>
            </xsl:for-each>
        </xsl:sort>
        <xsl:apply-templates select="Audit | Supplement/Audit">
            <xsl:sort select="AuditMtc/Term/From"/>
        </xsl:apply-templates>
        <xsl:text>
        </xsl:text>
    </xsl:for-each>
</xsl:template>

<xsl:template match="Audit">
    <xsl:value-of select="concat('[', AuditMtc/Term/From, ' To ', AuditMtc/Term/To, ']')"/>
</xsl:template>
</xsl:stylesheet>