объект в инструкции обработки получает изменение - PullRequest
0 голосов
/ 17 октября 2018

У меня есть XML-файл.

  1. Я преобразую инструкцию обработки в качестве элемента.
  2. Танкирующее значение инструкции обработки в атрибуте.
  3. Проблема в том,объект в инструкции обработки, который получает изменение.
  4. Я хочу, чтобы объект оставался таким, как есть.

             <element>
             <?comment adtxt="hello &#160; Guys"?>
            </element>
    

Мой код xslt:

        <xsl:template match="element">
        <xsl:copy>
        <xsl:apply-templates/>
        </xsl:copy>
        </xsl:template>
        <xsl:template match="processing-instruction(comment)">
        <inddq>
        <xsl:attribute name="adtxt">
        <xsl:value-of select="."/>
        </xsl:attribute>
        <xsl:processing-instruction name="comment">
        <xsl:value-of select="."/>
        </xsl:processing-instruction>
        </inddq>
        </xsl:template>

и вывод я получаю

    <element>
    <inddq adtxt="adtxt=&#34;hello &amp;#160; Guys&#34;">
    <?comment adtxt="hello &#160; Guys"?>
    </inddq>
    </element>

Уже спасибо,

1 Ответ

0 голосов
/ 17 октября 2018

Это сложная проблема, содержание инструкции по обработке не анализируется как XML, см. https://www.w3.org/TR/REC-xml/#sec-pi, говоря

PI не являются частью символьных данных документа

, так что если вы хотите проанализировать это содержимое как XML, так как вам кажется, что ссылка на символы XML должна интерпретироваться анализатором XML, а затем выводиться как &#160;, тогда для чистого решения потребуется XSLT 3 с

  1. parse-xml-фрагмент
  2. использование карты символов

Так что

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:output use-character-maps="m1"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:character-map name="m1">
      <xsl:output-character character="&#160;" string="&amp;#160;"/>
  </xsl:character-map>

    <xsl:template match="processing-instruction(comment)">
            <inddq>
            <xsl:attribute name="adtxt">
            <xsl:value-of select="parse-xml-fragment(.)"/>
            </xsl:attribute>
            <xsl:processing-instruction name="comment">
            <xsl:value-of select="."/>
            </xsl:processing-instruction>
            </inddq>
    </xsl:template> 

</xsl:stylesheet>

преобразует

<element>
         <?comment adtxt="hello &#160; Guys"?>
        </element>

с процессором XSLT 3, таким как Saxon 9.8 (https://xsltfiddle.liberty -development.net / eiZQaG3 ) или 9.9 или Altova 2017 или 2018 до

<element>
         <inddq adtxt='adtxt=&#34;hello &#160; Guys&#34;'><?comment adtxt="hello &#160; Guys"?></inddq>
        </element>

С другой стороны, это не сохранение какой-либо символьной ссылки внутри данных инструкции обработки, это просто способ проанализировать это как XML, а затем, для вывода, заменить любой символ Unicode без пробела через карту символов на последовательность &#160; представляетссылка на числовой символ этого символа.

Конечно, подход можно распространить и на другие ссылки на символы, но в любом случае карта символов будет применена к любому выходному символу, его невозможно ограничить только значением атрибута adtxt.

В качестве альтернативы использованию функции parse-xml-фрагмента XSLT / XPath 3 вы можете использовать replace, как это сделано в https://xsltfiddle.liberty -development.net / eiZQaG3 / 1 ,но для этого нужно использовать карту символов: https://xsltfiddle.liberty -development.net / eiZQaG3 / 1

...