2009-04-23 4 views
3

Как создать набор узлов из значений ....Как создать набор узлов из значений

У меня есть n чисел 1,2,3 ....... n.

Я хочу, чтобы создать узел установить

<MYNMUMS> 
<MYNUM>1</MYNUM> 
<MYNUM>2</MYNUM> 
<MYNUM>3</MYNUM> 
<MYNUM>4</MYNUM> 
.... 
<MYNUM>N</MYNUM> 
</MYNMUMS> 
+3

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

+1

Хороший вопрос и ответ на него может быть поучительным для многих людей. –

ответ

8

так легко, как:

XSLT 1.0 решение:

Это преобразование:

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

    <xsl:template match="/"> 
    <MyNums> 
     <xsl:call-template name="generateNumNodes"> 
     <xsl:with-param name="pStart" select="1"/> 
     <xsl:with-param name="pEnd" select="10"/> 
     </xsl:call-template> 
    </MyNums> 
    </xsl:template> 

    <xsl:template name="generateNumNodes"> 
     <xsl:param name="pStart"/> 
     <xsl:param name="pEnd"/> 

     <xsl:if test="$pEnd >= $pStart"> 
     <xsl:variable name="vNumNodes" 
      select="$pStart -$pEnd+1"/> 

     <xsl:choose> 
      <xsl:when test="$vNumNodes = 1"> 
      <MyNum><xsl:value-of select="$pStart"/></MyNum> 
      </xsl:when> 
      <xsl:otherwise> 
      <xsl:variable name="vHalf" select= 
       "floor(($pStart+$pEnd) div 2)"/> 
      <xsl:call-template name="generateNumNodes"> 
       <xsl:with-param name="pStart" select="$pStart"/> 
       <xsl:with-param name="pEnd" select="$vHalf"/> 
      </xsl:call-template> 

      <xsl:call-template name="generateNumNodes"> 
       <xsl:with-param name="pStart" select="$vHalf+1"/> 
       <xsl:with-param name="pEnd" select="$pEnd"/> 
      </xsl:call-template> 
      </xsl:otherwise> 
     </xsl:choose> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

при нанесении на любом документе XML (не используется), производит требуемый выход:

<MyNums> 
    <MyNum>1</MyNum> 
    <MyNum>2</MyNum> 
    <MyNum>3</MyNum> 
    <MyNum>4</MyNum> 
    <MyNum>5</MyNum> 
    <MyNum>6</MyNum> 
    <MyNum>7</MyNum> 
    <MyNum>8</MyNum> 
    <MyNum>9</MyNum> 
    <MyNum>10</MyNum> 
</MyNums> 

Обратите внимание следующее:

  1. ШаблонgenerateNumNodesсебя рекурсивно вызовы.

  2. Это рекурсия как раз (O(N)), и пространство (O(log2(N))) эффективным и практически не имеет переполнение стека - нет SO здесь!

  3. выше особенность достигается за счет реализации рекурсии в СВЦ (DiVide and Conquer) стиле.

  4. В отличие от tail-recursionон будет успешно выполнен на любом совместимом XSLT-процессоре.

  5. Максимальная глубина рекурсии, необходимая для генерации 1000000 (один миллион номеров), составляет всего лишь 19.

решение XSLT 2.0:

Еще более элементарным, не рекурсии, только с помощью XPath 2.0 to оператор:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
     <MyNums> 
      <xsl:for-each select="1 to 10"> 
      <MyNums> 
       <xsl:sequence select="."/> 
      </MyNums> 
      </xsl:for-each> 
     </MyNums> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Вы не можете создать Набор узлов XSLT. Нудессы получаются из исходного XML с помощью выбора или соответствия определенным критериям, но не могут быть созданы. Этот вопрос немного вводит в заблуждение. Выбранный ответ вверху просто показывает, как преобразовать данные в формате CSV в XML. – Lisa

0

XSLT это язык преобразований. Он обычно используется, когда у вас уже есть данные в форме XML-документа, который вы хотите преобразовать в другой документ (который может быть или не быть в формате XML).

Для того, чтобы начать с «сырых» данных и генерации представления XML, XSLT не подходит.

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

+2

Абсолютно неверно, что XSLT «не подходит» для задачи начать с «сырых» данных и генерировать представление XML ». Только два примера: 1. Функция f: json-document() FXSL, которая использует общую структуру LR-Parsing и синтаксический анализатор для JSON и создает XML-документ из экземпляра JSON. Все написано в чистом XSLT. 2. Парсер для XPath 2.0, написанный на XSLt, который использует ту же общую структуру LR-Parsing. Ссылки: [1] http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/func-json-document.xsl?revision=1.11&view=markup –

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