Почему XInclude экранирует как сущности символов XML/HTML, ?

#xml #xmllint #xinclude

Вопрос:

У меня есть очень простой XML-файл:

 <?xml version="1.0" encoding="UTF-8"?>

<!-- System configuration file -->
<!-- Minimum viable product of HIL simulator -->
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:xi="http://www.w3.org/2001/XInclude"
                xsi:schemaLocation="configuration.xsd">

    <application name="bridge" id="k1">
        <schedule>
            <process cpus="7" policy="SCHED_FIFO" priority="40"/>
        </schedule>
        <configuration>
            <sim_bridge servo_type="kDuplex">
                <xi:include href="TABLE.xml" parse="text" />
            </sim_bridge>
        </configuration>
    </application>
</configuration>
 

Стол стоит:

 <point surface_angle="-18.2" servo_angle="14.9"/>
<point surface_angle="-7.7" servo_angle="4.48"/>
<point surface_angle="-3.4" servo_angle="0.05"/>
<point surface_angle="2.1" servo_angle="-5.36"/>
<point surface_angle="12.2" servo_angle="-15.31"/>
 

Однако при запуске xmllint вывод не содержит символов < и > :

 <application name="bridge" id="k1">
    <schedule>
        <process cpus="7" policy="SCHED_FIFO" priority="40"/>
    </schedule>
    <configuration>
        <sim_bridge servo_type="kDuplex">
            amp;<point surface_angle="-18.2" servo_angle="14.9"/amp;>
            amp;<point surface_angle="-7.7" servo_angle="4.48"/amp;>
            amp;<point surface_angle="-3.4" servo_angle="0.05"/amp;>
            amp;<point surface_angle="2.1" servo_angle="-5.36"/amp;>
            amp;<point surface_angle="12.2" servo_angle="-15.31"/amp;>
        </sim_bridge>
    </configuration>
</application>
 

Есть ли какой-нибудь способ исправить это и получить выходной файл с правильным форматом?

Ответ №1:

Если ты изменишься

 <xi:include href="TABLE.xml" parse="text" />
 

Для

 <xi:include href="TABLE.xml" parse="xml" xpointer="xpointer(/r/point)" />
 

и сделать TABLE.xml быть хорошо сформированным, обернув его элементы одним корневым элементом,

 <r>
  <point surface_angle="-18.2" servo_angle="14.9"/>
  <point surface_angle="-7.7" servo_angle="4.48"/>
  <point surface_angle="-3.4" servo_angle="0.05"/>
  <point surface_angle="2.1" servo_angle="-5.36"/>
  <point surface_angle="12.2" servo_angle="-15.31"/>
</r>
 

тогда беги,

 xmllint --xinclude --format try.xml
 

вы увидите свой включенный файл в формате XML,

 <?xml version="1.0" encoding="UTF-8"?>
<!-- System configuration file -->
<!-- Minimum viable product of HIL simulator -->
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="configuration.xsd">
  <application name="bridge" id="k1">
    <schedule>
      <process cpus="7" policy="SCHED_FIFO" priority="40"/>
    </schedule>
    <configuration>
      <sim_bridge servo_type="kDuplex">

        <point surface_angle="-18.2" servo_angle="14.9"/>
        <point surface_angle="-7.7" servo_angle="4.48"/>
        <point surface_angle="-3.4" servo_angle="0.05"/>
        <point surface_angle="2.1" servo_angle="-5.36"/>
        <point surface_angle="12.2" servo_angle="-15.31"/>

      </sim_bridge>
    </configuration>
  </application>
</configuration>
 

как и просили.