Передача копии функции? - PullRequest
2 голосов
/ 01 июля 2011

Мне нужно выбрать копию следующих узлов:

<xsl:copy-of select="node1/node2/*" />

и мне нужно передать значение этой копии в функцию ProcessNodes, которая получает строку в качестве входного параметра, возвращает строку для некоторой обработки и записывает результат в виде:

<Data>
   Result of the function
</Data>

Я думал, что могу поставить

<Data>
    <xsl:copy-of select="myfunction:ProcessNodes(node1/node2/*)" />
</Data>

но это неверно.

Могу ли я знать правильный синтаксис для этого?

PS : На самом деле документ представляет собой XML, который выглядит примерно так:

<Node1>
    <Node2>
       <html>
          <body>
              <p>My first paragraph.</p>
              <p>My 2nd paragraph. And this paragrah
                 has 2 lines.</p>
          </body>
       </html> 
    </Node2>
</Node1>

и мне нужно написать их как

<Data>
    My first paragraph.
    My 2nd paragraph. And this paragrah has 2 lines.
</Data>

Обратите внимание, что 2 строки во втором абзаце объединены в 1 строку.

Вот почему мне нужна копия, чтобы теги <p> могли быть сохранены, и я могу выполнить расположение абзаца, который я хочу.

Я не знаю, есть ли что-нибудь попроще.

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Зачем функции нужна копия узлов?Почему он не может работать с оригиналом?

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

2 голосов
/ 01 июля 2011

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

<xsl:value-of select="myfunction:ProcessNodes(node1/node2)" />

После добавления вашего "PS" ваше намерение все еще остается неясным (по крайней мере для меня). Результат, которого вы хотите, может быть достигнут без какой-либо функции cutom. Например:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*/*/*/*">
        <Data>
            <xsl:apply-templates select="p"/>
        </Data>
    </xsl:template>

    <xsl:template match="p">
        <xsl:value-of select="concat(normalize-space(.),'&#xA;')"/>
    </xsl:template>

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