从样式表中提取xml属性

时间:2017-11-04 18:29:32

标签: xml xslt xpath

我有下面的示例xml表,我想获得下面样式表的transitLinetransitRoutestop元素的所有属性,但输出错误。

sample.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE transitSchedule SYSTEM "http://www.matsim.org/files/dtd/transitSchedule_v1.dtd">

<transitSchedule>
    <transitStops>
        <stopFacility id="1" x="-53196.450154726146" y="-3755010.0058102254" />
        <stopFacility id="1.1" x="-53196.450154726146" y="-3755010.0058102254" />
        <stopFacility id="1.2" x="-53196.450154726146" y="-3755010.0058102254" />
    </transitStops>
    <transitLine id="1001">
        <transitRoute id="1001_0">
            <transportMode>bus</transportMode>
            <routeProfile>
                <stop refId="180" Offset="00:00:00"/>
                <stop refId="58" Offset="00:03:00"/>
                <stop refId="152" Offset="00:05:00"/>
            </routeProfile>
        </transitRoute>
        <transitRoute id="1001_1">
            <transportMode>bus</transportMode>
            <routeProfile>
                <stop refId="190" Offset="00:00:00"/>
                <stop refId="58" Offset="00:03:00" />
                <stop refId="153" Offset="00:05:00"/>
            </routeProfile>
        </transitRoute>
    </transitLine>
    <transitLine id="10011">
        <transitRoute id="10011_0">
            <transportMode>bus</transportMode>
            <routeProfile>
                <stop refId="29.2" Offset="00:00:00" />
                <stop refId="202" Offset="00:04:00" />
                <stop refId="113" Offset="00:07:00" />
            </routeProfile>
        </transitRoute>
        <transitRoute id="10011_1">
            <transportMode>bus</transportMode>
            <routeProfile>
                <stop refId="29.2" Offset="00:00:00" />
                <stop refId="191" Offset="00:04:00" />
                <stop refId="187" Offset="00:07:00" />
            </routeProfile>
        </transitRoute>
    </transitLine>
</transitSchedule>

style.xsl               

    <xsl:template match="/">
        transitLine,transitRoute,routeProfile,links
        <xsl:for-each select="//transitLine">
            <xsl:value-of select="concat(@id,'&#xA;')"/>
                <xsl:for-each select="//transitRoute">
                    <xsl:value-of select="concat(',',@id,'&#xA;')"/>
                </xsl:for-each>
                <xsl:for-each select="//stop">
                        <xsl:value-of select="concat(',',@refId,'&#xA;')"/>
                </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

当前输出:

transitLine transitRoute routeProfile   
1001            
             1001_0     
             1001_1     
             10011_0        
             10011_1        
10011           
             1001_0     
             1001_1     
             10011_0        
             10011_1

预期产出:

transitLine"    transitRoute    routeProfile
    1001"       
                  1001_0    
                                  180
                                   58
                                  152
                  1001_1    
                                  90
    10011                         58
                                  153
                 1001_0 
                                  29.2
                                  202
                                  113
                 1001_1 
                                  292
                                  191
                                  187

1 个答案:

答案 0 :(得分:1)

您的脚本始终失败的主要原因(每个for-each loop)获取特定名称的所有标签(来自整个源文件)。

这&#34;采取所有&#34;方法只适用于最外层的循环。 对于嵌套循环,您应该只使用当前元素的元素。

该脚本应包含三个越来越嵌套的循环:

  • 最外层 - 适用于所有transitLine元素。
  • 下一个 - 适用于当前transitRoute的子transitLine元素。
  • 最嵌套的 - 当前stop的{​​{1}}元素。 但是这次 XPath 表达式应该包含transitRoute, 因为.//元素不是当前stop的直接子元素。

最后一件事:印刷文字没有必要的前导空格, 但包括不必要的逗号。

因此整个脚本应如下所示:

transitRoute

它提供了所需的输出。