我的.xml文件中有以下几行
<metadataObject ID="measurementFrameSet" classification="DESCRIPTION" category="DMD">
<metadataWrap mimeType="text/xml" vocabularyName="SAFE" textInfo="Frame Set">
<xmlData>
<safe:frameSet>
<safe:frame>
<safe:footPrint srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coordinates>43.838726,8.275868 44.232952,11.408423 42.557594,11.770112 42.163200,8.725094</gml:coordinates>
</safe:footPrint>
</safe:frame>
</safe:frameSet>
</xmlData>
</metadataWrap>
我能够读取整个节点
<xsl:for-each select="//metadataSection/metadataObject/metadataWrap/xmlData/safe:frameSet/safe:frame/safe:footPrint" >
<xsl:value-of select="gml:coordinates" />
</xsl:for-each>
但是我想以单独的方式在“gml:coordinates”节点中仅提取以下数值:43.838726,8.275868 42.557594,11.770112因为在我的最终xml中它们将被插入到单独的字段中。
有没有办法让xslt从该节点获取子字符串?最终的xml应如下所示:
<gmd:eastBoundLongitude>
<gco:Decimal>
43.838726
</gco:Decimal>
</gmd:eastBoundLongitude>
答案 0 :(得分:1)
这是一种非常简单(不是原始的)提取所需坐标的方法:
<xsl:template match="/">
<xsl:for-each select="//safe:footPrint" >
<xsl:variable name="set1" select="substring-before(gml:coordinates, ' ')" />
<xsl:variable name="set3" select="substring-before(substring-after(substring-after(gml:coordinates, ' '), ' '), ' ')" />
<output>
<coor1A>
<xsl:value-of select="substring-before($set1, ',')" />
</coor1A>
<coor1B>
<xsl:value-of select="substring-after($set1, ',')" />
</coor1B>
<coor3A>
<xsl:value-of select="substring-before($set3, ',')" />
</coor3A>
<coor3B>
<xsl:value-of select="substring-after($set3, ',')" />
</coor3B>
</output>
</xsl:for-each>
</xsl:template>
当然,样式表必须包含safe:
和gml:
前缀的名称空间声明(必须是XML输入)。
要生成所示格式的输出,您还必须将gmd:
和gco:
前缀绑定到其名称空间URI。
我正在使用XSLT 2.0
在XSLT 2.0中,你可以更优雅地做到:
<xsl:template match="/">
<xsl:for-each select="//safe:footPrint" >
<xsl:variable name="coordinates" select="tokenize(gml:coordinates, '\s|,')" />
<output>
<coor1A>
<xsl:value-of select="$coordinates[1]" />
</coor1A>
<coor1B>
<xsl:value-of select="$coordinates[2]" />
</coor1B>
<coor3A>
<xsl:value-of select="$coordinates[5]" />
</coor3A>
<coor3B>
<xsl:value-of select="$coordinates[6]" />
</coor3B>
</output>
</xsl:for-each>
</xsl:template>