xsl-копия раздела подэлемента с использованием xslt

#xml #xslt #copy

#xml #xslt #Копировать

Вопрос:

Я пытаюсь использовать XSLT для достижения нижеприведенного; Сохраните только первый заголовок, а затем все элементы «Detail» — все в разделе «Order». Я попробовал несколько вариантов копирования xsl; то, что я пробовал, также вставлено ниже.

Ввод:

 <Root>
<Order>
    <Header>
        <H1>abc</H1>
        <H2>123</H2>
    </Header>
    <Details>
        <Detail>
            <val1>test1</val1>
            <OrderId>111</OrderId>
        </Detail>
        <Detail>
            <val1>test2</val1>
            <OrderId>112</OrderId>
        </Detail>
    </Details>
</Order>
<Order>
    <Header>
        <H1>abc</H1>
        <H2>123</H2>
    </Header>
    <Details>
        <Detail>
            <val1>test3</val1>
            <OrderId>113</OrderId>
        </Detail>
        <Detail>
            <val1>test4</val1>
            <OrderId>114</OrderId>
        </Detail>
    </Details>
</Order>
</Root>
  

Ожидаемый результат

 <Order>
<Header>
    <H1>abc</H1>
    <H2>123</H2>
</Header>
<Details>
    <Detail>
        <val1>test1</val1>
        <OrderId>111</OrderId>
    </Detail>
    <Detail>
        <val1>test2</val1>
        <OrderId>112</OrderId>
    </Detail>
    <Detail>
        <val1>test3</val1>
        <OrderId>113</OrderId>
    </Detail>
    <Detail>
        <val1>test4</val1>
        <OrderId>114</OrderId>
    </Detail>
</Details>
</Order>
  

То, что я пробовал, приведено ниже. Но это не дало ожидаемых результатов для меня

 <?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" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />

<xsl:template match="*">
  <xsl:element name="{name(*[1])}">
     <xsl:copy-of select="*[1]/Header"/>
     <xsl:for-each select="*">
        <xsl:copy-of select="Detail"/>
     </xsl:for-each>
  </xsl:element>
</xsl:template>
</xsl:stylesheet>
  

Любая помощь приветствуется

Спасибо, Фарис

Ответ №1:

Почему бы просто не:

 <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:template match="/Root">
    <Order>
        <xsl:copy-of select="Order[1]/Header"/>
        <Details>
            <xsl:copy-of select="Order/Details/Detail"/>
        </Details>
    </Order>
</xsl:template>

</xsl:stylesheet>
  

Комментарии:

1. Это была намного более простая версия. 🙂 Спасибо, и это сработало!