【问题标题】:xslt extract numeric value from a node using substringxslt使用子字符串从节点中提取数值
【发布时间】:2016-08-02 09:35:37
【问题描述】:

我的 .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>

【问题讨论】:

  • 1. 如果要提取四个坐标,为什么输出只显示一个? 2. 如何准确识别要提取的坐标? 3. 你可以使用 XSLTT 2.0 吗?如果没有,您将使用哪个 XSLT 1.0 处理器?
  • P.S.搜索tokenize
  • 嗨迈克尔,1.输出只显示一个,因为它是最终 xml 中将出现的四个坐标的示例:westBoundLongitude、southBoundLongitude、northBoundLongitude。抱歉不够清楚。 2.输入的xml文件的格式总是一样的,所以我想提取子串要考虑数值的位置; 3.我正在使用我正在使用带有ECLIPSE版本的WINDOWS机器:Mars.2 Release (4.5.2)
  • Re #3:请确定具体的处理器 - 看这里如何:stackoverflow.com/questions/25244370/…
  • 另外,请修改您的 XML 输入,以便我们可以看到与 safe:gml: 前缀关联的命名空间。

标签: xml xslt substring


【解决方案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>

【讨论】:

  • 解决方案运行良好!我真的很欣赏它的原始方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 2021-04-29
相关资源
最近更新 更多