使用XSLT和XSLT1.0(MSXML 6)从XML输出文本

使用XSLT和XSLT1.0(MSXML 6)从XML输出文本,xml,xslt,xslt-1.0,msxml6,Xml,Xslt,Xslt 1.0,Msxml6,我有一个用XSLT1.0无法解决的问题。 XSLT2.0的解决方案已经给出,并且运行良好(见下文) 对于按STRAT_分区分组的每一层,需要DEPTHFROM_分区的最小值和DEPTHTO_分区的最大值 按STRAT_ZONE分组似乎不是一个选项,因为属性可以重复自身。 逐行检查是个好主意 有没有人有什么建议,如何尝试达到预期的目标 数据块: <ZONES> <ZONE STRAT_ZONE="Flysand unchained" DEPTHFRO

我有一个用XSLT1.0无法解决的问题。 XSLT2.0的解决方案已经给出,并且运行良好(见下文)

对于按STRAT_分区分组的每一层,需要DEPTHFROM_分区的最小值和DEPTHTO_分区的最大值

按STRAT_ZONE分组似乎不是一个选项,因为属性可以重复自身。 逐行检查是个好主意

有没有人有什么建议,如何尝试达到预期的目标

数据块:

<ZONES>
    
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="0.00" DEPTHTO_ZONE="0.30" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="0.30" DEPTHTO_ZONE="1.10" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="1.10" DEPTHTO_ZONE="1.40" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="1.40" DEPTHTO_ZONE="1.70" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="1.70" DEPTHTO_ZONE="1.80" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="1.80" DEPTHTO_ZONE="2.20" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="2.20" DEPTHTO_ZONE="2.60" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="2.60" DEPTHTO_ZONE="2.80" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="2.80" DEPTHTO_ZONE="2.90" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="2.90" DEPTHTO_ZONE="3.10" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="3.10" DEPTHTO_ZONE="3.40" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="3.40" DEPTHTO_ZONE="3.70" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="3.70" DEPTHTO_ZONE="4.50" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="4.50" DEPTHTO_ZONE="4.90" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Vulcanic" DEPTHFROM_ZONE="4.90" DEPTHTO_ZONE="6.00" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Vulcanic" DEPTHFROM_ZONE="6.00" DEPTHTO_ZONE="6.20" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Vulcanic" DEPTHFROM_ZONE="6.20" DEPTHTO_ZONE="6.30" INDEX_ZONE="-1"/>

</ZONES>
2.0版解决方案如下所示(感谢Martin Honnen):




但是,如何使用MSXML6处理器在XSLT1.0中实现相同的结果呢


非常感谢您的帮助。

在XSLT 1.0中有几种方法可以实现
组相邻
。我相信在你的情况下,最方便的方法是:

XSLT1.0

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

<xsl:key name="adj" match="ZONE" use="generate-id(preceding-sibling::ZONE[not(@STRAT_ZONE = current()/@STRAT_ZONE)][1])" />

<xsl:template match="/ZONES">
    <xsl:for-each select="ZONE[generate-id() = generate-id(key('adj', generate-id(preceding-sibling::ZONE[not(@STRAT_ZONE = current()/@STRAT_ZONE)][1]))[1])]">
        <xsl:variable name="current-group" select="key('adj', generate-id(preceding-sibling::ZONE[not(@STRAT_ZONE = current()/@STRAT_ZONE)][1]))" />
        <xsl:text>ZONE "</xsl:text>
        <xsl:value-of select="@STRAT_ZONE"/>
        <xsl:text>" </xsl:text>
        <xsl:for-each select="$current-group">
            <xsl:sort select="@DEPTHFROM_ZONE" data-type="number" order="ascending"/>
            <xsl:if test="position() = 1 ">
                <xsl:value-of select="@DEPTHFROM_ZONE"/>
            </xsl:if>
        </xsl:for-each>
        <xsl:text> </xsl:text>
        <xsl:for-each select="$current-group">
            <xsl:sort select="@DEPTHTO_ZONE" data-type="number" order="descending"/>
            <xsl:if test="position() = 1 ">
                <xsl:value-of select="@DEPTHTO_ZONE"/>
            </xsl:if>
        </xsl:for-each>
        <xsl:text> </xsl:text>
        <xsl:value-of select="@INDEX_ZONE"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

区域“
" 


这将根据前一个同级节点的
id
对节点进行分组,该同级节点的值与当前节点的值不同,并且该
id
对于具有相同值的所有相邻节点都是通用的。

这很好:)非常感谢

 <xsl:template match="ZONES">
      <xsl:for-each-group select="ZONE" group-adjacent="@STRAT_ZONE">
          <xsl:value-of 
            select="'ZONE', current-grouping-key(), min(current-group()/@DEPTHFROM_ZONE), max(current-group()/@DEPTHTO_ZONE), @INDEX_ZONE"/>
          <xsl:text>&#10;</xsl:text>
      </xsl:for-each-group>
  </xsl:template>

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

<xsl:key name="adj" match="ZONE" use="generate-id(preceding-sibling::ZONE[not(@STRAT_ZONE = current()/@STRAT_ZONE)][1])" />

<xsl:template match="/ZONES">
    <xsl:for-each select="ZONE[generate-id() = generate-id(key('adj', generate-id(preceding-sibling::ZONE[not(@STRAT_ZONE = current()/@STRAT_ZONE)][1]))[1])]">
        <xsl:variable name="current-group" select="key('adj', generate-id(preceding-sibling::ZONE[not(@STRAT_ZONE = current()/@STRAT_ZONE)][1]))" />
        <xsl:text>ZONE "</xsl:text>
        <xsl:value-of select="@STRAT_ZONE"/>
        <xsl:text>" </xsl:text>
        <xsl:for-each select="$current-group">
            <xsl:sort select="@DEPTHFROM_ZONE" data-type="number" order="ascending"/>
            <xsl:if test="position() = 1 ">
                <xsl:value-of select="@DEPTHFROM_ZONE"/>
            </xsl:if>
        </xsl:for-each>
        <xsl:text> </xsl:text>
        <xsl:for-each select="$current-group">
            <xsl:sort select="@DEPTHTO_ZONE" data-type="number" order="descending"/>
            <xsl:if test="position() = 1 ">
                <xsl:value-of select="@DEPTHTO_ZONE"/>
            </xsl:if>
        </xsl:for-each>
        <xsl:text> </xsl:text>
        <xsl:value-of select="@INDEX_ZONE"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>