Переместите и переименуйте узел KML, используя XSLT - PullRequest
1 голос
/ 04 апреля 2019

У меня есть следующий документ KML (XML):

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
  <Folder>
    <Placemark>
      <name>my name</name>
      <styleUrl>#my url</styleUrl>
      <ExtendedData>
         <Data name="firstID">
           <value>01234567</value>
         </Data>
         <Data name="secondID">
             <value/>
         </Data>
      </ExtendedData>
      <description>
           long description here
      </description>
      <Point>
         <coordinates>-1.1111,2.22222</coordinates>
      </Point>
      <address>my address</address>
    </Placemark>
  </Folder>
</Document>
</kml>

Я добился того, чтобы переместить узел 'address' в 'ExtendedData', и удалил узел 'data name = "secondId"', теперь мне нужно переименовать тег 'address' в 'Data name = "Address"' и заключить значение адреса в теги 'value', что приведет к чему-то вроде этого:

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
  <Folder>
    <Placemark>
      <name>my name</name>
      <styleUrl>#my url</styleUrl>
      <ExtendedData>
         <Data name="Address">
           <value>my address</value>
         </Data>
         <Data name="firstID">
           <value>01234567</value>
         </Data>
      </ExtendedData>
      <description>
           long description here
      </description>
      <Point>
         <coordinates>-1.1111,2.22222</coordinates>
      </Point>
    </Placemark>
  </Folder>
</Document>
</kml>

Пока это мой XSLT (перемещает адрес и удаляет secondID):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:kml="http://www.opengis.net/kml/2.2">
<xsl:output method= "xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="kml:address"/>

<xsl:template match="kml:ExtendedData">
   <xsl:copy>
     <xsl:copy-of select="../kml:address"/>
     <xsl:apply-templates/>
   </xsl:copy>
</xsl:template>

<xsl:template match="kml:Data[@name='secondID']" />

</xsl:stylesheet>

Чтобы переименовать, я пробовал это:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:kml="http://www.opengis.net/kml/2.2">
<xsl:output method= "xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="kml:address">
    <Data name="Address">
       <value>
        <xsl:apply-templates select="@* | node()"/>
       </value>
    </Data>
</xsl:template>

<xsl:template match="kml:ExtendedData">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:copy-of select="../kml:Data[@name='Address']"/>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="kml:Data[@name='secondID']" />

</xsl:stylesheet>

Это переименовывает адрес, но добавляет к тегу атрибут 'xmlns = "" и не перемещает вновь переименованный тег в «ExtendedData»

Есть идеи? Я новичок в XLST. Заранее спасибо

1 Ответ

3 голосов
/ 04 апреля 2019

Как насчет:

XSLT 1.0

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

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="kml:ExtendedData">
    <xsl:copy>
        <!-- move address to here -->
        <Data name="Address">
            <value>
                <xsl:value-of select="../kml:address"/>
            </value>
        </Data>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<!-- remove address at original position -->
<xsl:template match="kml:address"/>

</xsl:stylesheet>

Обратите внимание на добавленное объявление пространства имен в начальном теге xsl:stylesheet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...