Как я могу построить значение для выражения «для каждого» в XSLT с помощью параметра - PullRequest
1 голос
/ 19 марта 2010

Мне нужно перемещаться по этому дереву xml.

<publication>
    <corporate>
        <contentItem>
            <metadata>meta</metadata>
            <content>html</content>
        </contentItem>
        <contentItem >
            <metadata>meta1</metadata>
            <content>html1</content>
        </contentItem>
    </corporate>
    <eurasia-and-africa>
       ... 
    </eurasia-and-africa>
    <europe>
       ...
    </europe>
</publication>

и преобразовать его в HTML с помощью этой таблицы стилей

 <ul>
     <xsl:variable name="itemsNode" select="concat('publicationManifest/',$group,'/contentItem')"></xsl:variable>
     <xsl:for-each select="$itemsNode">
         <li>
        <xsl:value-of select="content"/>
         </li>
    </xsl:for-each>
</ul>

$ group - это параметр с именем группы, например, «корпоративный». У меня ошибка с составлением этой таблицы стилей. SystemID: D: \ 1 \ contentsTransform.xslt

Engine name: Saxon6.5.5
Severity: error
Description: The value is not a node-set
Start location: 18:0

В чем дело?

Ответы [ 2 ]

2 голосов
/ 19 марта 2010

В XSLT это может быть легко достигнуто следующим образом :

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

 <xsl:param name="pGroup" select="'corporate'"/>

 <xsl:template match="/">
   <ol>
       <xsl:for-each select="/*/*[name()=$pGroup]/contentItem">
        <li>
            <xsl:value-of select="content"/>
        </li>
       </xsl:for-each>
   </ol>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу, получается требуемый результат :

<ol>
    <li>html</li>
    <li>html1</li>
</ol>

Запишите использование функции XPath name () .

2 голосов
/ 19 марта 2010

Вы не можете создавать и оценивать динамические выражения XPath. И 99,9% времени вам не нужно. Следствие: если вы чувствуете необходимость динамически оценивать XPath, вы, скорее всего, делаете что-то не так.

Объявите ваш $pGroup параметр:

<xsl:param name="pGroup" select="''" />

… создайте шаблон для вашего элемента документа (<publication>):

<xsl:template match="publication">
  <body>
    <!-- select only elements with the right name here -->
    <xsl:apply-templates select="*[name() = $pGroup]" />
  </body>
</xsl:template>

… и один для произвольных элементов, которые содержат <contentItem> элементов:

<xsl:template match="*[contentItem]">
  <ul>
    <xsl:apply-templates select="contentItem" />
  </ul>
</xsl:template>

… и один для <contentItem> самих элементов:

<xsl:template match="contentItem">
  <li>
    <xsl:value-of select="content" />
  </ul>
</xsl:template>

Готово.

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