Преобразование GML с XSLT - PullRequest
       23

Преобразование GML с XSLT

1 голос
/ 03 апреля 2011

Я пытался выяснить, что не так с этим фрагментом кода, но через 4 часа я сдаюсь! Я перепробовал множество различных решений здесь на stackoverflow и из разных источников, но ни одно из них не сработало.

Все, что я пытаюсь сделать, это поместить значение "gml: координаты" в атрибут "точка". Я думаю, это как-то связано с пространством имен. Или что-то еще ...

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" insted of "/ gml: координаты"):

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 Ответ

3 голосов
/ 03 апреля 2011

Просто замените :

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

Дальнейший рефакторинг :Код можно еще более упростить, используя * 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>
...