【问题标题】:Transforming GML with XSLT使用 XSLT 转换 GML
【发布时间】:2011-04-03 11:14:37
【问题描述】:

我试图弄清楚这段代码有什么问题,但是,4 小时后,我放弃了!我在 stackoverflow 和网络上尝试了很多不同的解决方案,但它们都不起作用。

我要做的就是将“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 脚本(如果属性设置为“/gml:coordinates”的“-7 -7 0 7 -7 0 7 7 0 -7 7 0”,则返回正确的结果):

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。有关代码中两个问题的解释、修复和进一步重构,请参阅我的答案,从而显着简化代码并使其更具可读性。
  • 您的“XML 文件”不是 XML 文件,因为它没有声明 gmp 命名空间。我强烈怀疑您已经简化了文件以忽略命名空间声明等“不相关”的细节,这往往表明您没有意识到命名空间声明远非无关紧要 - 它们通常是问题的核心,例如这个。

标签: xml xslt gml


【解决方案1】:

只需替换

<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. &lt;xsl:text&gt; 自身不能包含其他 xsl 元素 -- 只能包含文本

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

进一步重构:使用*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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多