Создать элемент XML без закрывающего тега, используя XSLT - PullRequest
1 голос
/ 18 ноября 2011

Мне нужно иметь возможность создавать элементы XML в следующем формате, используя XSLT:

<element foo="x" bar="y" />

Кажется, я ограничен:

<element foo="x" bar="y"></element>

Причина в том, что у нас естьизменение процесса, но интерфейс к клиенту не может измениться.Вы можете предположить, что они по существу равны, и вы были бы правы, но мы не можем, однако, предположить, что наши клиенты используют разумные методы анализа XML.

Я пробовал:

<Mapping>
   <xsl:attribute name="Source">
      <xsl:value-of select="@Source"/>
   </xsl:attribute>
   <xsl:attribute name="Destination">
      <xsl:value-of select="@Destination"/>
   </xsl:attribute>
</Mapping>

, что, очевидно,добавляет нежелательный конечный тег и:

<xsl:element name="Mapping">
   <xsl:attribute name="Source">
      <xsl:value-of select="@Source"/>
   </xsl:attribute>
   <xsl:attribute name="Destination">
      <xsl:value-of select="@Destination"/>
   </xsl:attribute>
 </xsl:element>

при этом еще добавляется нежелательный конечный тег.

Может кто-нибудь помочь?

Ответы [ 5 ]

1 голос
/ 18 ноября 2011

Я не знаю способа заставить XSLT использовать сокращенную форму. Даже если бы был такой способ, он, вероятно, зависел бы от реализации. На самом деле, если я попробую что-то наподобие ваших примеров в XMLSpy, он на самом деле использует короткую запись для вывода, независимо от того, как я установил xml:space.

Возможно, вы захотите проверить, какие настройки можно выполнить на используемом процессоре XSLT и поддерживает ли он что-то важное.

Если честно, я бы сказал, что если какой-либо клиент не может установить эквивалентность <element/> и <element></element>, он не совместим с XML до такой степени, что его можно сломать. Это их проблема, и они должны это исправить.

0 голосов
/ 20 ноября 2011

На самом деле не должно иметь значения, каким образом сериализуются пустые элементы XML, поскольку любой синтаксический анализатор XML будет рассматривать их как эквивалентные. Но если вы хотите, чтобы все было иначе, вы можете выбрать другой процессор XSLT. Saxon доступен в .NET, и если вы переключитесь, вы получите все преимущества XSLT 2.0, а также сможете решить эту небольшую проблему.

0 голосов
/ 18 ноября 2011

Кто-нибудь может помочь?

В .NET есть - способ достижения этой цели :

Напишите свой собственный класс, полученный из XmlWriter и перезапишите все необходимые перегрузки метода WriteElementString(), поэтомучто вы полностью контролируете сериализацию элементов.

Наконец, используйте XslCompiledTransform.Transform(), передавая в качестве аргумента экземпляр вашего класса.

0 голосов
/ 18 ноября 2011

Это не должно быть проблемой, как комментирует Джо.Однако вы должны иметь возможность загружать и нормализовать сгенерированный XML:

$str = <<<XML
<root>
    <element foo="x" bar="y"></element>
</root>
XML;

$doc = new DomDocument;
$doc->loadXML($str);
echo $doc->saveXML();

Вывод:

<?xml version="1.0"?>
<root>
    <element foo="x" bar="y"/>
</root>

Поскольку загрузка и сохранение могут быть инициированы с помощью normalizeDocument*Функция 1009 *, в вашем коде вы можете просто добавить ее после преобразования.

0 голосов
/ 18 ноября 2011

Вы пытались удалить все пробелы после <Mapping> (или <xsl:element name="Mapping">) и последующих элементов?Движок XSLT может рассматривать их как контент и, таким образом, открывает обычный элемент только для того, чтобы узнать, что писать нечего.

<xsl:element name="Mapping"><xsl:attribute name="Source"><xsl:value-of select="@Source" /></xsl:attribute></xsl:element>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...