2

スペースで区切られた座標タプルのリストがあり、任意の数のタプルがあります。各タプルは、2次元座標のスペースで区切られたリストで構成されています。たとえば、「1.1 2.8 1.2 2.9」は、POINT(1.1 2.8)からPOINT(1.2 2.9)までの線を表します。代わりに「1.1,2.81.2,2.9」にする必要があります。XSLTを使用して、数値のペア間のスペースからコンマへの置換を実行するにはどうすればよいですか?「string(gml:LinearRing / gml:posList)」があります。

これは、ジオメトリを使用してGML3.1.1機能を吐き出すJavaWebサービスで使用されています。このサービスは、XSLTを使用してGMLドキュメントをKMLドキュメント(少なくとも「重要」と見なされるチャンク)に変換することにより、オプションのKML出力をサポートします。XSLT 1.0にロックされているため、XSLT2.0からの正規表現はオプションではありません。

GMLはlat/lonを使用し、KMLはlon/latを使用することを知っています。これはXSLTの前に処理されていますが、XSLTでも処理されると便利です。


あなたの解決策をありがとう、ディミトレ。自分のニーズに合わせて少し変更したので、他の人に役立つ場合に備えて、ここに含めます。2次元のタプルを想定して、座標リストを介して再帰を実行します。

これは2つの機能を実行します。軸の交換(GMLおよびKML仕様によるlon/latのlat/lon)と、各タプル内の座標区切り文字をスペース''からコンマ'、'に変更します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:gml="http://www.opengis.net/gml" exclude-result-prefixes="gml">
   <xsl:output method="xml" encoding="UTF-8" indent="yes" />

   <!-- other portions omitted -->

   <xsl:template match="gml:pos">
      <xsl:call-template name="coordinateSequence">
         <xsl:with-param name="coords" select="normalize-space(string(.))" />
      </xsl:call-template>
   </xsl:template>

   <xsl:template match="gml:posList">
      <xsl:call-template name="coordinateSequence">
         <xsl:with-param name="coords" select="normalize-space(string(.))" />
      </xsl:call-template>
   </xsl:template>

   <xsl:template name="coordinateSequence">
      <xsl:param name="coords" />
      <xsl:if test="string-length($coords) > 0">
         <xsl:variable name="lat" select="substring-before($coords, ' ')" />
         <xsl:variable name="lon">
            <xsl:value-of select="substring-before(substring-after($coords, ' '), ' ')" />
            <xsl:if test="string-length(substring-before(substring-after($coords, ' '), ' ')) = 0">
               <xsl:value-of select="substring-after($coords, ' ')" />
            </xsl:if>
         </xsl:variable>
         <xsl:variable name="remainder" select="substring-after(substring-after($coords, ' '), ' ')" />

         <xsl:value-of select="concat($lon, ',', $lat)" />
         <xsl:if test="string-length($remainder) > 0">
            <xsl:value-of select="' '" />
            <xsl:call-template name="coordinateSequence">
               <xsl:with-param name="coords" select="$remainder" />
            </xsl:call-template>
         </xsl:if>
      </xsl:if>
   </xsl:template>

</xsl:stylesheet>
4

2 に答える 2

3

この変換(中間ステップも示しています):

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

 <xsl:template match="/*">
  <xsl:variable name="vNorm" select="normalize-space()"/>
  <xsl:variable name="vP1" select=
  "concat(substring-before(., ' '), ',',
          substring-before(substring-after($vNorm, ' '),' ')
          )"/>

  <xsl:variable name="vPart2" select="substring-after(substring-after($vNorm,' '),' ')"/>

  <xsl:variable name="vP2" select=
  "concat(substring-before($vPart2, ' '), ',',
          substring-after($vPart2, ' ')
          )"/>


  <xsl:value-of select="$vP1"/>
==========
  <xsl:value-of select="$vP2"/>
==========
  <xsl:value-of select="concat($vP1, ' ', $vP2)"/>
 </xsl:template>
</xsl:stylesheet>

このXMLドキュメントに適用した場合:

<t>1.1 2.8 1.2 2.9</t>

必要な正しい結果(最後の行)を生成します:

1.1,2.8
==========
  1.2,2.9
==========
  1.1,2.8 1.2,2.9

便宜上、このコードを名前付きテンプレートに配置して、必要な行ごとに呼び出すことができます。

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

 <xsl:template match="/*">
  <xsl:call-template name="convertLine"/>
 </xsl:template>

 <xsl:template name="convertLine">
  <xsl:param name="pStr" select="."/>

  <xsl:variable name="vNorm" select="normalize-space($pStr)"/>
  <xsl:variable name="vP1" select=
  "concat(substring-before($pStr, ' '), ',',
          substring-before(substring-after($vNorm, ' '),' ')
          )"/>

  <xsl:variable name="vPart2" select="substring-after(substring-after($vNorm,' '),' ')"/>

  <xsl:variable name="vP2" select=
  "concat(substring-before($vPart2, ' '), ',',
          substring-after($vPart2, ' ')
          )"/>


  <xsl:value-of select="concat($vP1, ' ', $vP2)"/>
 </xsl:template>
</xsl:stylesheet>
于 2012-09-20T02:24:02.333 に答える
0
<xsl:for-each select="tokenize($in, ' ')">
  <xsl:value-of select="concat($t, if (position() mod 2) = 0 then ' ' else ',')"/>
</xsl:for-each>
于 2012-09-20T08:09:04.910 に答える