Есть ли xpath для получения только этих значений

Может ли кто-нибудь помочь мне получить правильный Xpath для соответствующего преобразования через xslt??

Поскольку я пытаюсь преобразовать input.xml, используя xslt через xpath (document(input.xml)//track), чтобы получить желаемый результат, как указано ниже.

введите xml: как указано ниже

    <mergingTracksBreakdownStructure>
    <track id="10">
      <mergedTrack id="10"/>
      <mergedTrack id="11"/>
      <mergedTrack id="12"/>
       <track id="13">
         <mergedTrack id="13"/>
         <mergedTrack id="14"/>
           <track id="15">
              <mergedTrack id="15"/>
               <mergedTrack id="16"/>
            </track>
        </track>
    </track>
    <track id="27">
      <mergedTrack id="27"/>
    </track>
    <track id="30">
    <mergedTrack id="30"/>
    </track>
    </mergingTracksBreakdownStructure>

Необходим вывод xml: как указано ниже


    <mergingTracksBreakdownStructure>
     <track id="10">
       <mergedTrack id="10"/>
       <mergedTrack id="11"/>
       <mergedTrack id="12"/>
    </track>
    <track id="13">
      <mergedTrack id="13"/>
      <mergedTrack id="14"/>
    </track>
    <track id="15">
      <mergedTrack id="15"/>
      <mergedTrack id="16"/>
    </track>
    <track id="27">
      <mergedTrack id="27"/>
    </track>
    <track id="30">
      <mergedTrack id="30"/>
    </track>
    </mergingTracksBreakdownStructure>

XSLT используется для преобразования:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.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="node()|@*">
        <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/">
        <xsl:result-document href="output.xml" method="xml">
        <xsl:apply-templates select="document('input.xml')//track"/>
        </xsl:result-document>
    </xsl:template>

</xsl:stylesheet>

person user13679165    schedule 04.06.2020    source источник
comment
Почему вам нужно использовать функцию xsl:result-document или document()?   -  person michael.hor257k    schedule 05.06.2020
comment
извините, сейчас отредактировал строку кода xslt, ‹xsl:result-document href=output.xml method=xml› Что касается необходимости, я хочу преобразовать input.xml в output.xml с некоторыми другими шаблонами. Спасибо @michael.hor257k   -  person user13679165    schedule 05.06.2020


Ответы (1)


Запрошенный результат можно легко получить, применив следующую таблицу стилей к входному XML:

<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="/mergingTracksBreakdownStructure">
    <xsl:copy>
        <xsl:apply-templates select="track"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="track">
    <xsl:copy>
        <xsl:copy-of select="@* | mergedTrack"/>
    </xsl:copy>
    <xsl:apply-templates select="track"/>
</xsl:template>

</xsl:stylesheet>
person michael.hor257k    schedule 05.06.2020