XSLT поможет в объявлении пространства имен - PullRequest
0 голосов
/ 20 сентября 2010

нужна помощь в решении следующей проблемы. Мне нужно преобразовать приведенный ниже ввод (XML) в упомянутый вывод (XML).

   <Header>
      <End_Date xsi:nil="true"/>
   <Header>

В следующем формате.

   <Header>
      <End_Date xsi:nil="true" xmlns:xsi"http://www.w3.org/2001/XMLSchema"/>
   <Header>

Это таблица стилей:

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

    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>  

    <xsl:template match="/">  
      <HEADER>  
        <xsl:for-each select="HEADER">  
          <xsl:sequence select="(./@node(), ./node())"/>
        </xsl:for-each>  
      </HEADER>  
    </xsl:template> 
</xsl:stylesheet>

Спасибо заранее. Gabriel

1 Ответ

0 голосов
/ 27 сентября 2010

Правильно ли я считаю, что вы хотите воспроизвести почти точную копию входного XML с добавлением декларации пространства имен xsi, отсутствующей во входных данных?

Во-первых, как и сейчас, ваш ввод не является правильно сформированным XML, просто из-за отсутствия объявления пространства имен xsi. Следовательно, нет никакого способа использовать XSLT для его добавления: любой XSLT-процессор захлебнется неправильной формой ввода.

Во-вторых, вы должны проверить чувствительность к регистру: в настоящее время ни одно из входных узлов не соответствует выражению <xsl:for-each select="HEADER"> select. Если вы измените его на "Header", правило шаблона действительно заменит ввод <Header> на <HEADER>, содержимое которого копируется одинаково. Но ... только если у вас есть объявления пространства имен в праве ввода ...

Итак, если цель действительно состоит в том, чтобы «обновить» некорректно сформированный XML до правильно сформированной версии, я бы предложил поискать другие инструменты, такие как Perl, Awk или любой другой простой поиск / замена. решение, которое работает с простым текстом и может просто добавить отсутствующее объявление пространства имен в элемент документа:

<Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <End_Date xsi:nil="true"/>
</Header>

(Конечно, вы также можете использовать функцию unparsed-text($href) в XSLT 2.0, которая позволяет вам читать любой файл в виде неразобранного текста, который затем можно будет обработать с помощью <xsl:analyze-string>. См. Статью Майкла Кея Наверх -конверсия с использованием XSLT 2.0 для дальнейшего вдохновения. Поскольку это довольно неуклюжий способ обработки не-XML с помощью инструмента XML, я даю это просто для полноты - если добавление префикса пространства имен является единственной проблемой, которую нужно решить, я определенно выбрал бы более дешевый вариант поиска / замены.)

Надеюсь, это поможет,

Рон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...