2015-03-09 3 views
2

Я сейчас вхожу в мир XSLT, потому что мне нужно сделать преобразование между двумя файлами XML.XSLT: Вставить новую строку между двумя элементами в шаблоне

Я начинаю, но у меня возникает небольшая проблема, которая делает мои файлы мало читаемыми для каждого поколения.

Я в качестве входных данных в XML, который:

<?xml version="1.0" encoding="utf-8"?> 
<ConfigurationNodes> 
    <Versions> 
     <PackagesA Version="1.8" /> 
     <PackageB Version="1.1" /> 
     <PackageC Version="1.7" /> 
    </Versions> 
    <ConfigurationNode Type="SomeSpecialType"> 
     <Name>MyName</Name> 
     <Revision>0</Revision> 
     <Description >The big full description here</Description> 
    </ConfigurationNode> 
</ConfigurationNodes> 

На которой я в настоящее время применяется следующее преобразование:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="ConfigurationNode[@Type='SomeSpecialType']"> 
    <Object Name="Configuration" NodeType="SomeOtherType"> 
     <Property Name="Name" Value="{Name/text()}" Type="System.String"/> 
     <Property Name="Description" Value="{Description/text()}" Type="System.String"/> 
     <Property Name="Revision" Value="{Revision/text()}" Type="System.Int32" /> 
    </Object> 
    </xsl:template> 


    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Эта работа, но в настоящее время мои Property элементы находятся на одной и той же линии (и в моем реальном случае у меня здесь 10 объектов):

<?xml version="1.0" encoding="utf-8"?> 
<ConfigurationNodes> 
    <Versions> 
     <PackagesA Version="1.8" /> 
     <PackageB Version="1.1" /> 
     <PackageC Version="1.7" /> 
    </Versions> 
    <Object Name="Configuration" NodeType="SomeOtherType"><Property Name="Name" Value="MyName" Type="System.String" /><Property Name="Description" Value="The big full description here" Type="System.String" /><Property Name="Revision" Value="0" Type="System.Int32" /></Object> 
</ConfigurationNodes> 

Мой Цель состоит в том, чтобы иметь

<?xml version="1.0" encoding="utf-8"?> 
<ConfigurationNodes> 
    <Versions> 
     <PackagesA Version="1.8" /> 
     <PackageB Version="1.1" /> 
     <PackageC Version="1.7" /> 
    </Versions> 
    <Object Name="Configuration" NodeType="SomeOtherType"> 
     <Property Name="Name" Value="MyName" Type="System.String" /> 
     <Property Name="Description" Value="The big full description here" Type="System.String" /> 
     <Property Name="Revision" Value="0" Type="System.Int32" /> 
    </Object> 
</ConfigurationNodes> 

После некоторых исследований, я пытался поставить <xsl:preserve-space elements="*"/>, не повезло.

Я читал везде людей, имеющих обратную проблему (слишком много места), но я не нашел той же проблемы, что и у меня.

Я думаю, вы уже догадались, что я делаю это преобразование в Visual studio (пространство имен msxsl).

+0

У вас есть '', поэтому я удивлен, что ваш результат не с отступом. Как выполнить преобразование непосредственно в Visual Studio? Или вы пишете код .NET, чтобы запустить его, например. C# или VB? В этом случае покажите нам код, который у вас есть, возможно, вы неправильно используете API-интерфейс XslCompiledTransform, чтобы убедиться, что директива 'xsl: output' имеет эффект. –

+0

Да, я делаю это непосредственно в Visual Studio ('Debug -> Запуск XSLT (без) отладки'). Странные вещи состоят в том, что все элементы, которые не затрагиваются этим шаблоном, имеют отпечаток правильно. Я попытался поставить «indent» в false, он ничего не меняет – J4N

+1

Если вы не показываете весь код, никто не может попытаться воспроизвести вашу проблему. –

ответ

6

У меня нет процессора MSXML для тестирования, но мне удалось создать ту же проблему, используя процессор libxslt. Здесь проблема может быть решена путем добавления:

<xsl:strip-space elements="*"/> 

до верхнего уровня таблицы стилей. Это, BTW, должно быть почти всегда включено, если вы используете шаблон с преобразованием тонов.

+0

Это действительно работает :). Но я не понимаю, почему, strip-space означает, что мы удаляем пространство, не так ли? поэтому зачем указывать, что мы хотели бы удалить пространство для всех элементов, теперь у него есть пробелы? – J4N

+0

@ J4N Поскольку это поведение несовместимо со всеми процессорами, я вижу очень мало смысла в попытке понять логику, стоящую за ним (если предположить, что за этим стоит * логика). –

+0

Согласен, но я не ожидаю противоположного поведения;). В любом случае, это решит мою текущую проблему. – J4N

Смежные вопросы