XSLT - не может извлечь дочерние узлы данного узла - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть следующий XML файл и я хочу извлечь часть этого XML файла. Я пробовал разные xslts, но у меня ничего не вышло. Я не мог понять, где я допустил ошибку.

Пример файла

   <GetDataResponse xmlns="http://test">
         <GetDataResult>
            <Classification>TEST</Classification>
            <data>
               <ItemList xmlns="">
                  <Item>
                     <CommonMetadata>
                        <InfoCoreId>6719d364-7145-4f60-b5c2-07c38a29cce5</InfoCoreId>
                        <FirstReceivedTimestamp>2020-03-31T12:29:51.977Z</FirstReceivedTimestamp>
                        <LastUpdatedTimestamp>2020-03-31T12:29:51.977Z</LastUpdatedTimestamp>
                        <CacheExpiresOnTimestamp>2020-04-28T12:29:51.977Z</CacheExpiresOnTimestamp>
                        <IsDeleted>False</IsDeleted>
                        <ADSName>Test</ADSName>
                        <ADSURI/>
                        <ADSInfoCoreId>885bc303-13b2-48e2-8186-8d60cb0ceecf</ADSInfoCoreId>
                        <IngestionName>Test</IngestionName>
                        <IngestionId>bd0c753e-5262-48cd-b946-7f3a1220ac31</IngestionId>
                        <Description>Test</Description>
                        <SourceAssignedId/>
                        <SourceChecksum/>
                        <Author/>
                        <Geography>
                           <KMLRepresentation>
                              <kml:kml xmlns:kml="http://www.opengis.net/kml/2.2">
                                 <kml:Placemark>
                                    <kml:description>TEST</kml:description>
                                    <kml:Point>
                                       <kml:coordinates>111111,22222</kml:coordinates>
                                    </kml:Point>
                                 </kml:Placemark>
                              </kml:kml>
                           </KMLRepresentation>
                        </Geography>
                        <BSO/>
                        <ModeOfOperation>Live</ModeOfOperation>
                     </CommonMetadata>
                  </Item>
               </ItemList>
            </data>
            <xsltOutputFormat/>
         </GetDataResult>
      </GetDataResponse>

Я хочу получить все узлы и их значения в разделе «данные». узел элемента, как показано ниже;

Ожидаемый файл

              <ItemList xmlns="">
                  <Item>
                     <CommonMetadata>
                        <InfoCoreId>6719d364-7145-4f60-b5c2-07c38a29cce5</InfoCoreId>
                        <FirstReceivedTimestamp>2020-03-31T12:29:51.977Z</FirstReceivedTimestamp>
                        <LastUpdatedTimestamp>2020-03-31T12:29:51.977Z</LastUpdatedTimestamp>
                        <CacheExpiresOnTimestamp>2020-04-28T12:29:51.977Z</CacheExpiresOnTimestamp>
                        <IsDeleted>False</IsDeleted>
                        <ADSName>Test</ADSName>
                        <ADSURI/>
                        <ADSInfoCoreId>885bc303-13b2-48e2-8186-8d60cb0ceecf</ADSInfoCoreId>
                        <IngestionName>Test</IngestionName>
                        <IngestionId>bd0c753e-5262-48cd-b946-7f3a1220ac31</IngestionId>
                        <Description>Test</Description>
                        <SourceAssignedId/>
                        <SourceChecksum/>
                        <Author/>
                        <Geography>
                           <KMLRepresentation>
                              <kml:kml xmlns:kml="http://www.opengis.net/kml/2.2">
                                 <kml:Placemark>
                                    <kml:description>TEST</kml:description>
                                    <kml:Point>
                                       <kml:coordinates>111111,22222</kml:coordinates>
                                    </kml:Point>
                                 </kml:Placemark>
                              </kml:kml>
                           </KMLRepresentation>
                        </Geography>
                        <BSO/>
                        <ModeOfOperation>Live</ModeOfOperation>
                     </CommonMetadata>
                  </Item>
               </ItemList>

Прикладной XSLT-1

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="GetDataResponse/GetDataResult/data">

   <xsl:value-of select="."/>

 </xsl:template>
</xsl:stylesheet>

Прикладная XSLT-2

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>


 <xsl:template match="GetDataResponse/GetDataResult/data">

    <xsl:copy-of select="node()"/>

 </xsl:template>
</xsl:stylesheet>

Но ни одна из этих работ для меня не работает. В чем проблема с моим xslt?

Спасибо за помощь.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2020

Я думаю, вам следует проверить пространства имен, используемые во входном файле.

Вот решение, которое делает то, что вы хотите. Обратите внимание, что вы не можете игнорировать пространства имен, вы должны принять это во внимание при обработке узлов.

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tst="http://test">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates select="tst:GetDataResponse/tst:GetDataResult/tst:data"/>
    </xsl:template>

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

</xsl:stylesheet>

Смотрите, как это работает здесь: https://xsltfiddle.liberty-development.net/gVhDDyS

1 голос
/ 14 апреля 2020

Или просто:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <xsl:copy-of select="//ItemList"/>
</xsl:template>

</xsl:stylesheet>

Хотя лично я предпочел бы более явный путь:

<xsl:copy-of select="*/*/*/ItemList"/>
1 голос
/ 14 апреля 2020

Решение без пространств имен:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="*">
    <xsl:element name="{local-name(.)}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

 <xsl:template match="@*">
    <xsl:attribute name="{local-name(.)}">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>

<xsl:template match="/">
    <xsl:copy>
        <xsl:apply-templates select="//ItemList"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/jxDiMBU

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