Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 我想根据子节点';来自标签的名称_Xslt - Fatal编程技术网

Xslt 我想根据子节点';来自标签的名称

Xslt 我想根据子节点';来自标签的名称,xslt,Xslt,我们想从中的元素xsl排序 <?xml version="1.0"?> <General><CommlCoverage> <Audit> <AuditMtc> <Term> <From>2013-07-05</From>

我们想从中的元素xsl排序

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

2013-07-05
2014-06-02
2013-07-02
2014-06-02
2013-01-02
2014-06-02
2013-07-052014-06-02
2013-07-022014-06-02
需要根据日期进行排序第一个标签审计具有不同的结构,第二个补充标签具有不同的结构,具有不同的日期 我的代码:

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

我们已更新所需的输出:
[2013-01-02至2014-06-02]
[2013-01-02至2014-06-02]
[2013-07-02至2014-06-02][2013-07-02至2014-06-02][2013-07-05至2014-06-02][2013-07-05至2014-06-02]

您可能首先要有一个与根元素匹配的模板

<xsl:template match="/*">
试试这个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>

(这与您的预期输出不太匹配,因为您的预期输出显示了六个“从”和“到”时间段,但您的输入中只有五个时间段)。

不确定我对需求的看法是否正确,但以下代码就是这样做的: 根据任意//术语/自对“CommlCollege”进行排序,然后按排序顺序写入所有//术语/自

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


我不确定我是否正确理解了这个问题。您能否澄清“不同结构”的含义,并举例说明您希望如何对其进行分类以及原因?不同的结构是:“CommlCollege/Audit/AuditMtc/Term/From”,第二个是“CommlCollege/Supplement/Audit/AuditMtc/Term/From”,需要[2013-01-02至2014-06-02][2013-07-02至2014-06-02][2013-07-05至2014-06-02]我也在使用这段代码。你能编辑你的问题以包含所有这些信息,而不是将其添加为注释吗?理想情况下,问题应该显示您当前的输入、预期的输出以及您当前尝试的代码。谢谢我已根据您在问题中的预期结果简化了答案。不需要在“CommlCoverage”上为每个元素执行xsl:for,因为它是根元素,因此只有一个元素。您正在排序的是后代元素。@KamleshGupta如果它解决了您的问题,请接受这个答案(在左边打勾)。先生,实际上,您可以在循环上编写代码吗?因为“CommlCoverage”多次出现,所以我想处理循环。您需要编辑您的问题以显示一个例子,因为在“CommlCoverage”元素是根元素,因此XML格式良好时只能出现一次。如果您给出一个包含多个“CommlCoverage”元素的XML示例,以及您在本例中期望的输出,我相信代码可以更改以适应。我们面临From标记的问题,因为它是“CommlCoverage/Audit”和“CommlCoverage/Supplement/Audit”的两个不同子代标记。请帮助:)根据上述xslt运行输入XML时生成的输出:[2013-01-02至2014-06-02][2013-07-02至2014-06-02][2013-07-05至2014-06-02][2013-07-02至2014-06-02][2013-07-05至2014-06-02]
<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]
<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>