Как перебрать элементы XML с помощью xsl - PullRequest
2 голосов
/ 31 июля 2011

У меня есть такой сценарий в xml:

<ViewFields>
  <FieldRef Name="Planing Status" />
  <FieldRef Name="Resource Status" />
  <FieldRef Name="Development Status" />
  <FieldRef Name="Testing Status" />
</ViewStatus>

Я должен пройти через это в xsl, я следовал ниже:

<xsl:template name="FieldRef_body.Status" match="FieldRef[@Name=/ViewFields/FieldRef[1]]" mode="body">

ЭТО НЕ ВОЗВРАЩАЕТСЯ @NameПеременная я использую несколько мест в этом разделе.Я хочу присвоить значения FieldRef переменной @Name через цикл.

1 Ответ

2 голосов
/ 31 июля 2011
<xsl:template name="FieldRef_body.Status" 
     match="FieldRef[@Name=/ViewFields/FieldRef[1]]" mode="body"> 

Здесь следует отметить две вещи :

  1. Атрибут match содержит выражение XPath, которое при применении к предоставленному документу XML выбирает no node на всех . Предполагается выбрать элемент с именем FieldRef, строковое значение которого, атрибут Name равен строковому значению первого FieldRef дочернего элемента ViewFields верхнего элемента. Однако ни один из элементов FieldRef в документе XML не имеет (непустого) строкового значения. С другой стороны, строковые значения всех атрибутов Name не являются пустыми. Я думаю, что вы хотели: match="FieldRef[@Name=/ViewFields/FieldRef[1]/@Name]"

  2. Любой шаблон в (неанонимном) режиме не рассматривается процессором XSLT для выбора, если его режим отличается от текущего режима .

Поскольку начальный режим в XSLT 1.0 (и в XSLT 2.0) является пустым (анонимным) режимом, единственный способ создать шаблон в неанонимном режиме, который рассматривается для выбора, - это явно указать режим для <xsl:apply-templates> инструкция.

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

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

 <xsl:template match="/">
     <xsl:apply-templates select="*/*" mode="body"/>
 </xsl:template>

 <xsl:template match="FieldRef[@Name=/ViewFields/FieldRef[1]/@Name]"
               mode="body">
  <xsl:value-of select="@Name"/>
 </xsl:template>
</xsl:stylesheet>

дает этот результат, показывая, что шаблон выбран для обработки :

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