Member 14764472 Ответов: 1

Мне нужно преобразовать сложный XML в простой XML


Как указано в названии, возможно ли использовать xsl или мне следует посмотреть на VB. Я не программист, но хорошо читаю. Это фрагмент моего XML-кода, и я работал над первым ребенком, если я смогу взломать его, то все остальное должно встать на свои места.
МОЙ XML-ФАЙЛ
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="205.xsl"?>
<data>
<satellite name="Telstar" longitude="205" lof_hi="10600000" lof_lo="9750000" lof_threshold="11700000" lnb_power="13/18v" signal_22khz="auto" toneburst="none" diseqc1_0="none" diseqc1_1="none" motor="none">
  <transponder original_network_id="1" ts_id="65535" frequency="11714000" symbol_rate="25000000" polarisation="H" />
  <transponder original_network_id="1" ts_id="65535" frequency="11729000" symbol_rate="25000000" polarisation="V">
    <program name="Channel_1 HD" service_id="40805" channel_number="48" type="1" scrambled="false" parental_lock="false" skip="false" id="1500" plp_id="255" sdt_version="28" default_channnel_num="17" lcn="2697" fav="0">
      <video pid="165" format="h264" />
      <pcr pid="165" />
      <audio pid="110" format="ac3" language="spa" />
      <audio pid="111" format="ac3" language="dos" />
    </program>
    <program name="Channel_2 HD" service_id="40806" channel_number="14" type="1" scrambled="false" parental_lock="false" skip="false" id="1501" plp_id="255" sdt_version="28" default_channnel_num="18" lcn="2698" fav="0">
      <video pid="160" format="h264" />
      <pcr pid="160" />
      <audio pid="80" format="ac3" language="spa" />
      <audio pid="81" format="ac3" language="qaa" />
    </program>
    <program name="Channel_3 HD" service_id="40807" channel_number="34" type="1" scrambled="false" parental_lock="false" skip="false" id="1502" plp_id="255" sdt_version="28" default_channnel_num="19" lcn="2699" fav="0">
      <video pid="161" format="h264" />
      <pcr pid="161" />
      <audio pid="86" format="ac3" language="spa" />
      <audio pid="87" format="ac3" language="qaa" />
    </program>
    </transponder>
    </satellite>
   </data>


МОЙ XSL
<?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"/>
     <xsl:template match="/">
       <xsl:element name="Servicelist">
       <xsl:element name="satellite">
       <xsl:text></xsl:text>
       <xsl:for-each select = "data"> 
        <xsl:text>SatId 1 /SatId </xsl:text>
            <xsl:text></xsl:text>
            <xsl:for-each select="satellite">
            <xsl:value-of select="@name" />
            <xsl:text></xsl:text>
            <xsl:value-of select="@lof_lo" />
            <xsl:text></xsl:text>
            <xsl:value-of select="@lof_hi" />
            <xsl:text></xsl:text>
            <xsl:value-of select="@lof_threshold" />
            <xsl:text></xsl:text>
            <xsl:value-of select="@longitude" />
            <xsl:text></xsl:text>
           <xsl:text>0 </xsl:text>
            <xsl:text></xsl:text>                
            </xsl:for-each>
        </xsl:for-each>       
       </xsl:element>
       </xsl:element>
     </xsl:template>
</xsl:stylesheet>


МОЙ ВЫХОД
<?xml version="1.0" encoding="UTF-8"?>
<Servicelist>
<satellite>
SatId 1 /SatId 
Telstar
9750000
10600000
11700000
205
0 
</satellite>
</Servicelist>


НЕОБХОДИМЫЙ КОД
<?xml version="1.0" encoding="UTF-8"?>
<Servicelist>
  <Satellite>
    <SatId>1</SatId>
    <SatName>Telstar</SatName>
    <LO1Frequency>9750</LO1Frequency>
    <LO2Frequency>10600</LO2Frequency>
    <BandSwitchFreq>11700</BandSwitchFreq>
    <Longitude>205</Longitude>
    <SkewOffset>0</SkewOffset>
  </Satellite>
<Servicelist>


Что я уже пробовал:

Мне нужно выяснить, как получить отображаемые элементы (например, "спутник"), а также как переименовать элементы... Кроме того, элемент <satid> отсутствует в исходном xml, поэтому я добавил его в xsl как текст, но xsl выдает мне ошибку, если я добавляю теги кода (<>). Правильно ли я поступаю с xsl или мне следует использовать другой подход?? Любой совет приветствуется и благодарю вас.

1 Ответов

Рейтинг:
12

Richard Deeming

Небольшое изменение вашего XSL приведет к желаемому результату:

<?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"/>
    <xsl:template match="/">
        <Servicelist>
            <xsl:for-each select="data/satellite">
                <xsl:variable name="i" select="position()" />
                
                <Satellite>
                    <SatId><xsl:value-of select="$i" /></SatId>
                    <SatName><xsl:value-of select="@name" /></SatName>
                    <LO1Frequency><xsl:value-of select="@lof_lo" /></LO1Frequency>
                    <LO2Frequency><xsl:value-of select="@lof_hi" /></LO2Frequency>
                    <BandSwitchFreq><xsl:value-of select="@lof_threshold" /></BandSwitchFreq>
                    <Longitude><xsl:value-of select="@longitude" /></Longitude>
                    <SkewOffset>0</SkewOffset>
                </Satellite>
            </xsl:for-each>
        </Servicelist>
    </xsl:template>
</xsl:stylesheet>
То SatId это будет порядковый номер, начинающийся с 1.