2016-03-23 1 views
1

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

<pets> 
    <Pet> 
     <category> 
      <id>4</id> 
      <name>Lions</name> 
     </category> 
     <id>9</id> 
     <name>Lion 3</name> 
     <photoUrls> 
      <photoUrl>url1</photoUrl> 
      <photoUrl>url2</photoUrl> 
     </photoUrls> 
     <status>available</status> 
     <tags> 
      <tag> 
       <id>1</id> 
       <name>tag3</name> 
      </tag> 
      <tag> 
       <id>2</id> 
       <name>tag4</name> 
      </tag> 
     </tags> 
    </Pet> 
</pets> 

в этот формат XML.

<pets> 
    <Pet> 
     <category> 
      <id>4</id> 
      <name>Lions</name> 
     </category> 
     <id>9</id> 
     <name>Lion 3</name> 
     <photoUrl>url1</photoUrl> 
     <photoUrl>url2</photoUrl> 
     <status>available</status> 
     <tag> 
      <id>1</id> 
      <name>tag3</name> 
     </tag> 
     <tag> 
      <id>2</id> 
      <name>tag4</name> 
     </tag> 
    </Pet> 
</pets> 

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

<xsl:template match="photoUrls"/> 

Как это можно сделать в xslt. Любая помощь приветствуется.

+0

Это похоже на работу. \t \t \t \t Тем не менее любая обратная связь ценится. Это лучший способ или есть другие лучшие способы сделать это? –

ответ

1

Следующая XSLT делает работу,

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

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

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

    <xsl:template match="tags"> 
     <xsl:copy-of select="tag" /> 
    </xsl:template> 
</xsl:stylesheet> 

Но если у вас есть какой-либо другой способ сделать это, пожалуйста, не стесняйтесь оставлять свой ответ здесь.

3

Я хотел бы сделать это следующим образом:

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

    <xsl:template match="photoUrls|tags"> 
     <!-- Apply identity transform on child elements of photoUrls/tags--> 
     <xsl:apply-templates select="*"/> 
    </xsl:template> 

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

Это работает, когда у меня нет пространств имен в моем xml, но не удается удалить теги, когда у меня есть пространство имен (soapenv) в моем xml. Как я могу изменить его для работы? –

+0

Получил это, я добавил [local-name()] перед тегом, и он работает. –

0

Вы можете использовать этот код также.

<?xml version="1.0" encoding="UTF-8" ?><xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:output method="xml"/> 

<xsl:template match="photoUrls|tags"> 
    <xsl:copy-of select="node()"/> 
</xsl:template> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:transform> 
+0

Не копируйте атрибуты, если вы не копируете родительский элемент. –

+0

Спасибо @ michael.hor257k за исправление :) – Hikmat