XSL удаляет пустые узлы в одном и том же коде - PullRequest
0 голосов
/ 10 сентября 2010

Я создал следующую таблицу стилей XSL, которая принимает пакет XML (полученный от SVN) и преобразует все «входные» узлы, которые не включают в себя текст «архив», в разделенный запятыми список для мой ANT скрипт Пример XML-файла выглядит следующим образом ....

<?xml version="1.0"?>
<lists>
   <list path="https://mydomain.com/branches">
      <entry kind="dir">
         <name>James_Work</name>
         <commit revision="2209">
            <author>James</author>
            <date>2010-09-02T11:02:08.584250Z</date>
         </commit>
      </entry>
   </list>
</lists>

... и мой XSL это ....

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes" />

   <xsl:variable name="selectionPropertyList">
      <xsl:for-each select="lists/list/entry[name!='archive']">svnType/<xsl:value-of select="name" />
         <xsl:if test="position()!=last()">,</xsl:if> 
      </xsl:for-each>
   </xsl:variable>

   <xsl:template match="/">
      <root>
         <svnType><xsl:copy-of select="$selectionPropertyList" /></svnType>
      </root>
   </xsl:template>
</xsl:stylesheet>

Проблема, с которой я сталкиваюсь, - это когда я возвращаю пустой пакет. Это может произойти, например, если я вызову папку ветвей SVN, которая в настоящее время пуста, и в результате получу пустую запись в моем списке ANT.

Пример пакета XML выглядит следующим образом

<?xml version="1.0"?>
<lists>
   <list path="https://mydomain.com/branches">
   </list>
</lists>

Кто-нибудь знает, как я мог бы как-то отфильтровать эти пустые пакеты из моих списков?

Спасибо, Джеймс

P.S. Я попробовал советы, приведенные здесь, но они не совсем соответствуют тому, что я пытаюсь сделать здесь. http://www.tek -tips.com / viewthread.cfm? QID = 1088712 & страница = 1

Обновление

Большой пример ввода:

<?xml version="1.0"?>
<lists>
<list path="https://mydomain.com/website/branches">
<entry kind="dir">
   <name>ITNAM-752</name>
   <commit revision="2171">
       <author>jcb4337</author>
       <date>2010-08-30T15:13:21.006125Z</date>
   </commit>
</entry>
<entry kind="dir">
   <name>JCB4337-577</name>
   <commit revision="2171">
      <author>jcb4337</author>
      <date>2010-08-30T15:13:21.006125Z</date>
   </commit>
 </entry>
 <entry kind="dir">
     <name>JCB4337-726</name>
     <commit revision="2209">
        <author>jcb4337</author>
        <date>2010-09-02T11:02:08.584250Z</date>
      </commit>
  </entry>
  <entry kind="dir">
      <name>JCB4337-808</name>
      <commit revision="2206">
          <author>jcb4337</author>
          <date>2010-09-01T13:01:51.693625Z</date>
      </commit>
  </entry>
  <entry kind="dir">
        <name>JCB4337-847</name>
        <commit revision="2172">
            <author>jcb4337</author>
            <date>2010-08-30T15:14:12.803000Z</date>
         </commit>
  </entry>
 </list>
</lists>

Вывод, который мне нужно получить из XSL, примерно такой:

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <branches>branches/ITNAM-752,branches/JCB4337-577,branches/JCB4337-726,branches/JCB4337-808,branches/JCB4337-847</branches>
</root>

Я использовал код @ Алехандро, приведенный выше, и я вот-вот, думаю. Но по пути я получаю странные результаты. Пример вывода:

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

          branches/ITNAM-752,
          branches/JCB4337-577,
          branches/JCB4337-726,
          branches/JCB4337-808,
          branches/JCB4337-847,

      </branches>
      </root>

Итак ...

1) Получение большого количества пустого пространства между элементами списка.

2) У меня все еще есть дополнительная запятая в конце результатов.

3) Когда я пытаюсь применить это к нашей папке тегов SVN, я получаю некоторые странные результаты. Теги немного отличаются, потому что они содержат эту «архивную» папку, которую я хочу исключить из любых результатов.

В настоящее время, когда я выводю папку тегов, используя тот же код, я получаю это ...

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


        archive

        jcb4337
        2010-08-31T08:56:51.006125Z


         tags/milestone 1-0-0,
         tags/milestone 1-0-0b,
         tags/milestone 1-0-1,
         tags/milestone 1-0-10,
         tags/milestone 1-0-11,
         tags/milestone 1-0-2,
         tags/milestone 1-0-3,
         tags/milestone 1-0-4,
         tags/milestone 1-0-5,
         tags/milestone 1-0-6,
         tags/milestone 1-0-7,
         tags/milestone 1-0-8,
         tags/milestone 1-0-9,

      </tags>
    </root>

Так много пробелов и архивов, наряду со всей отметкой времени, появляется информация об авторе, используя решение @Alejandro.

Кстати, если вам интересно, что ANT выполняет замену токена сразу после завершения XSL. Он заменяет фразу svnType в XML. Я не мог придумать способ применения префиксных веток / тегов на каждом узле с использованием XSL.

Надеюсь, что все это поможет немного больше, и еще раз спасибо за усилия всех. На данный момент XSL для меня немного чёрное искусство: -).

Ответы [ 3 ]

1 голос
/ 10 сентября 2010

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*"/>
    <xsl:template match="list/entry[name!='archive']">
        <xsl:value-of select="concat('svnType/',
                                     name,
                                     substring(',',
                                               1,
                                               position()!=last())
                                     )"/>
    </xsl:template>
    <xsl:template match="/">
        <root>
            <svnType>
                <xsl:choose>
                    <xsl:when test="lists/list/entry/name!='archive'">
                        <xsl:apply-templates/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:comment>There is no entry
                                     without "archive" name</xsl:comment>
                    </xsl:otherwise>
                </xsl:choose>
            </svnType>
        </root>
    </xsl:template>
</xsl:stylesheet>

Выход:

<root>
    <svnType>svnType/James_Work</svnType>
</root>

С этим входом:

<lists>
    <list path="https://mydomain.com/branches"></list>
</lists>

Выход:

<root>
    <svnType>
        <!--There is no entry with "archive" name-->
    </svnType>
</root>

РЕДАКТИРОВАТЬ : xsl:strip-space для удаления пробелов только текстовых узлов из входного источника.

РЕДАКТИРОВАНИЕ : Кроме того, подход стиля извлечения:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*"/>
    <xsl:template match="entry[name!='archive']">
        <xsl:call-template name="output"/>
        <xsl:text>,</xsl:text>
    </xsl:template>
    <xsl:template match="entry[name!='archive'][last()]"
                  name="output"
                  priority="1">
        <xsl:value-of select="concat('svnType/',name)"/>
    </xsl:template>
    <xsl:template match="lists">
        <root>
            <svnType>
                <xsl:apply-templates/>
            </svnType>
        </root>
    </xsl:template>
    <xsl:template match="list[not(entry/name!='archive')]">
        <xsl:comment>There is no entry without "archive" name</xsl:comment>
    </xsl:template>
</xsl:stylesheet>

Вывод обеих таблиц стилей:

<root>
   <svnType>svnType/ITNAM-752,svnType/JCB4337-577,svnType/JCB4337-726,svnType/JCB4337-808,svnType/JCB4337-847</svnType>
</root>
0 голосов
/ 10 сентября 2010
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />

<xsl:template match="list">
    <xsl:text>svnType/</xsl:text><xsl:value-of select="entry/name" />
    <xsl:if test="position()!=last()">,</xsl:if>
</xsl:template>

<xsl:template match="/">
    <root>
        <svnType>
            <xsl:apply-templates select="//list[entry/name!='archive'][*]" />
        </svnType>
    </root>
</xsl:template>
</xsl:stylesheet>

в основном [*] говорит, что элемент списка должен иметь дочерние узлы.

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

Изменение выражения соответствия на:

<xsl:template match="/lists[list/entry[name != 'archive']]">

должно работать.

(я бы также использовал apply-templates вместо $ selectionPropertyList, но это другая проблема)

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