Как я могу отправить узел (любой) в xsl: function? - PullRequest
6 голосов
/ 28 августа 2009

Могу ли я отправить узел в функцию XSLT? Например:

<books>
  <book>
    <author>a1</author>
    <price>10</price>
    <year>2009</year>
  </book>
  <!-- ... -->
</books>

Могу ли я отправить элемент <book> в функцию - внутри этой функции я хочу обработать узлы в книге (<author>, <price> или <year>)

Могу ли я создать функцию xsl: как показано ниже?

 <xsl:function name="util:checkNode" as="xs:boolean">
      <!-- I would like to know xml schema data type for the param -->
       <xsl:param name="nodeP" as="****"/>
  </xsl:function


          If yes, what xsl schema type to the param ? 

Похоже, я создал много путаницы для всех, сказав функцию вместо xsl: function ----: (

Ответы [ 5 ]

8 голосов
/ 31 августа 2009

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

Если вам интересно, что использовать для значения атрибута as = "", у вас есть несколько вариантов. Если вы хотите быть очень слабым и принимать что угодно, используйте as = "item () *" .

С сайта Дэвида Поусона :

item () * .. своего рода набор узлов? W3C

Да, я согласен, это выглядит довольно бессмысленно, не так ли? Тем не мение. По состоянию на ЧР, это довольно важно, особенно если вы хотите использовать типы. И хочу генерировать, скажем, набор узлов .. извините последовательность, в переменной.

<xsl:variable name="a"
 select="(//h3)[position() < 3]"
 as="item()*"/>

Это создает переменную, которую вы можете взломать в использовании Xpath довольно легко. То есть запомнить элемент () *.

типов ... несколько примеров. W3C

Из пояснительного письма от Майка Кей, спасибо Майк. Примеры:

<xsl:param name="x" as="item()"/>

значение параметра может быть любым элементом (то есть узел или атомное значение). Но это должен быть один элемент.

<xsl:param name="x" as="item()?"/>

параметр может быть одним элементом или пустая последовательность

<xsl:param name="x" as="item()+"/>

параметр должен быть последовательностью один или несколько предметов - пустая последовательность не допускается

<xsl:param name="x" as="item()*"/>

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

<xsl:param name="x" as="node()*"/>

параметр может быть любой последовательностью ноль или более узлов

<xsl:param name="x" as="xs:atomicValue*"/>

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

item () * - самый общий тип возможно, это соответствует всему, как «Объект» в Java. По этой причине это обычно может быть опущено. Но нет всегда, например, тип по умолчанию в xsl: переменная не item () *, но document-node (), чтобы гарантировать, что

<xsl:variable name="rtf"><a>thing</a> </xsl:variable>

продолжает вести себя как XSLT 1.0

Используйте их для указания параметров, типы переменных и т. д.

0 голосов
/ 30 августа 2009

Существует множество функций XSLT, которые принимают узлы в качестве параметров. Например, все аргументы concat могут быть узлами, например ::10000

concat(myelement, myelement/@myattribute)

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

Редактировать

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

0 голосов
/ 28 августа 2009

Чтобы добавить к ответу ChaosPandion , может потребоваться добавить тест узла к вашему запросу XPath:

<xsl:call-template name="TemplateName">
    <xsl:with-param name="ParamName" select="MyNode/MyNode/node()" />
</xsl:call-template>

<xsl:template name="TemplateName">
    <xsl:param name="ParamName" />
</xsl:template>

Официально, node() не является функцией, это тест, но может возвращать значение, подобное свойству XmlNode.InnerXml.

0 голосов
/ 28 августа 2009

В вашем вопросе:

Могу ли я отправить элемент в функцию - внутри этой функции я хочу обработать узлы в книге (, или )

и последующие комментарии:

Могу ли я иметь функцию, которая принимает узел в качестве параметра?

... вы запрашиваете функцию, но я думаю, что вам нужно template для book элемента .

Конечно, вы можете сделать это несколькими способами - в цикле for-each, фактически отправляя узел book в шаблон, используя with-param и т. Д. - но простой template должен выполнить то, что вам нужно. То, что соответствует шаблону, является «параметром».

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

<xsl:template match="books">
  <xsl:apply-templates select="book"/>
</xsl:template>

<xsl:template match="book">
    author: <xsl:value-of select="author" />
    price: <xsl:value-of select="price" />
    year: <xsl:value-of select="year" />
</xsl:template>

</xsl:stylesheet>

Если вы хотите выполнить дальнейшую обработку для подэлементов (автор, цена и год), вы можете также создать шаблоны для них. Помните, что соответствующий «год» будет соответствовать всем элементам года, даже для тех, которые у вас могут быть в дате рождения и т. Д. (В этих случаях вы, вероятно, захотите ограничить XPath в матче или просто сохранить book/year обработка в шаблоне книги.) Скажем, вы хотите сделать что-то дополнительно с year. Ваша обработка книг может развиться в нечто вроде этого (где вы сейчас передаете каждый year узел в качестве параметров в шаблон года):

<xsl:template match="book">
    author: <xsl:value-of select="author" />
    price: <xsl:value-of select="price" />
    <xsl:apply-templates select="year" />
</xsl:template>

<xsl:template match="year">
   <xsl:choose>
      <xsl:when test="year &lt; '2000'">
         from a prior century: <xsl:value-of select="." />
      </xsl:when>
      <xsl:otherwise>
         from this century: <xsl:value-of select="." />
      </xsl:otherwise>
   </xsl:choose>
</xsl:template>
0 голосов
/ 28 августа 2009

XSL не волнует, что это за параметр. Это действительно обрабатывает все как XML. Если текст передается, он рассматривается как текстовый узел.

Вот пример со ссылкой для дальнейшего использования.

http://www.w3schools.com/xsl/

<xsl:call-template name="TemplateName">
    <xsl:with-param name="ParamName" select="MyNode/MyNode" />
</xsl:call-template>

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