使用XSLT转换GML

时间:2011-04-03 11:14:38

标签: xml xslt gml

我试图弄清楚这段代码有什么问题,但是,4小时后,我放弃了!我在stackoverflow上尝试了很多不同的解决方案,并且从web环绕,bot都没有工作。

我想做的就是将“gml:coordinates”值放到“point”属性中。我想这与命名空间有关。或其他什么......

XML文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<gml:LineString>
    <gml:coordinates>-7 -7 0 7 -7 0 7 7 0 -7 7 0</gml:coordinates>
</gml:LineString>

XSL文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:gml="http://www.opengis.net/gml">

<xsl:template match="/gml:LineString">
    <Transform>
        <Shape>
            <IndexedFaceSet>
                <xsl:attribute name="coordIndex">
                    <xsl:text>0 1 2 3 -1</xsl:text>
                </xsl:attribute>

                <Coordinate>
                    <xsl:attribute name="point">
                        <xsl:text>
                            <xsl:value-of select="/gml:coordinates" />
                        </xsl:text>
                    </xsl:attribute>
                </Coordinate>
            </IndexedFaceSet>
        </Shape>
    </Transform>
</xsl:template>
</xsl:stylesheet> 

Ajax脚本(如果属性设置为“-7 -7 0 7 -7 0 7 7 0 -7 7 0”,则返回正确的结果“/ gml:coordinates”):

var xml = document.implementation.createDocument("", "", null);
var xsl = document.implementation.createDocument("", "", null);
xml.async = false;
xsl.async = false;
xml.load("xsl/ajax.xml");
xsl.load("xsl/ajax.xsl");
var processor = new XSLTProcessor();
processor.importStylesheet(xsl);
var output = processor.transformToFragment(xml, document);
document.getElementById("scene").appendChild(output);

提前致谢。

1 个答案:

答案 0 :(得分:3)

只需替换

<Coordinate>
  <xsl:attribute name="point">
    <xsl:text>
      <xsl:value-of select="/gml:coordinates" />
    </xsl:text>
  </xsl:attribute>
</Coordinate>

<强>与

<Coordinate>
  <xsl:attribute name="point">
      <xsl:value-of select="gml:coordinates" />
  </xsl:attribute>
</Coordinate>

解释:此处至少存在两个问题:

  1. <xsl:text>本身不能包含其他xsl元素 - 只有文字

  2. XPath表达式/gml:coordinates不会选择任何内容,因为源XML文档中没有/gml:coordinates顶部元素。

  3. 进一步重构:使用* AVT * s(属性值模板)可以进一步简化代码:

    <强>替换

    <Coordinate>
      <xsl:attribute name="point">
          <xsl:value-of select="gml:coordinates" />
      </xsl:attribute>
    </Coordinate>
    

    <强>与

    <Coordinate point="{gml:coordinates}"/>
    

    <强>替换

    <IndexedFaceSet>
      <xsl:attribute name="coordIndex">
        <xsl:text>0 1 2 3 -1</xsl:text>
      </xsl:attribute>
    

    <强>与

    <IndexedFaceSet coordIndex="0 1 2 3 -1">
    

    更正和重构后的完整代码

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:gml="http://www.opengis.net/gml">
        <xsl:template match="/gml:LineString">
            <Transform>
                <Shape>
                    <IndexedFaceSet coordIndex="0 1 2 3 -1">
                        <Coordinate point="{gml:coordinates}"/>
                    </IndexedFaceSet>
                </Shape>
            </Transform>
        </xsl:template>
    </xsl:stylesheet>
    

    ,结果是

    <Transform xmlns:gml="http://www.opengis.net/gml">
        <Shape>
            <IndexedFaceSet coordIndex="0 1 2 3 -1">
                <Coordinate point="-7 -7 0 7 -7 0 7 7 0 -7 7 0"/>
            </IndexedFaceSet>
        </Shape>
    </Transform>