Преобразование атрибутов на тот же уровень, что и родительский с данными XML - PullRequest
0 голосов
/ 10 мая 2018

Я хочу переместить атрибуты своих дочерних узлов в качестве элемента к родителю.напримерИзмените ниже xml

<Parent>
 <Children>
 <Child-id Name="John Doe">52bf9104-2c5e-4f1f-a66d-552ebcc53df7</Child>
 <Child-id Name="Some One">52bf9104-2c5e-4f1f-a66d-552ebcc53daa</Child>

 </Children>
</Parent>

на

<Parent>

 <child-id>52bf9104-2c5e-4f1f-a66d-552ebcc53df7</child>
 <Name>John Doe</Name>
 <child-id>52bf9104-2c5e-4f1f-a66d-552ebcc53daa</child>
 <Name>John Doe</Name>
</Parent>

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Следующий файл XSLT-1.0 преобразует XML в требуемое состояние:

<?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" omit-xml-declaration="yes" indent="yes"/>

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

  <xsl:template match="Children">          <!-- Remove 'Children' element -->
    <xsl:apply-templates select="node() | @*" />
  </xsl:template>   

  <xsl:template match="Child-id">          <!-- Transform 'Child-id' element -->
    <child-id><xsl:value-of select="." /></child-id>
    <Name><xsl:value-of select="@Name" /></Name>
  </xsl:template> 

</xsl:stylesheet>

Вывод:

<Parent>
    <child-id>52bf9104-2c5e-4f1f-a66d-552ebcc53df7</child-id>
    <Name>John Doe</Name>
    <child-id>52bf9104-2c5e-4f1f-a66d-552ebcc53daa</child-id>
    <Name>Some One</Name>
</Parent>
0 голосов
/ 10 мая 2018

Пожалуйста, попробуйте XSLT ниже. Для создания элементов из имен атрибутов необходимо использовать шаблоны значений атрибутов

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

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

    <xsl:template match="Child-id">
        <xsl:copy>
            <xsl:apply-templates />
        </xsl:copy>
        <xsl:for-each select="@*">
            <xsl:variable name="attrName" select="local-name()" />
            <xsl:element name="{$attrName}">
                <xsl:value-of select="." />    
            </xsl:element>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

выход

<Parent>
   <Children>
      <Child-id>52bf9104-2c5e-4f1f-a66d-552ebcc53df7</Child-id>
      <Name>John Doe</Name>
      <Child-id>52bf9104-2c5e-4f1f-a66d-552ebcc53daa</Child-id>
      <Name>Some One</Name>
   </Children>
</Parent>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...