почему я получаю Обязательное количество значений переменной $ depts ровно одно; поставленное значение имеет мощность более одного - PullRequest
0 голосов
/ 05 мая 2019

Здесь я пытаюсь найти домашнее задание, и онлайн-учитель никогда не отвечает на мои вопросы.Я продолжаю получать сообщение об ошибке при попытке обработать документ XML.«XTTE0570: Требуемое количество элементов значения переменной $ depts равно единице; указанное значение имеет количество элементов больше одного» * ​​

Инструкции по решению проблемы:

  1. Сначала создайтешаблон с именем getemployees.

  2. В шаблоне getEmployees создайте переменную с именем depts, содержащую последовательность следующих текстовых строк, представляющих коды отделов для данных примера Люси: 'a00', 'c01', 'd11', 'd21', 'e11' и 'e21'.

  3. После строки для создания переменной depts создайте элемент департаменты.

  4. В элементе департаментов вставьте цикл for-each, который проходит по каждой записи в последовательности depts.

  5. Для каждой записи в последовательности depts выполните следующие действия:

    a.Создайте переменную с именем currentDept, равную текущему элементу в последовательности depts.

    b.Создайте элемент с именем отдел с атрибутом с именем deptiD, значение которого равно значению переменной currentDept.

    c.Используйте функцию doc () для ссылки на файл «deptcurrent.xml», где current - это значение переменной currentDept.(Подсказка: используйте функцию concat () для объединения текстовых строк для «dept», переменной currentDept и текстовой строки «.xml».)

    d.Используйте элемент copy-of, чтобы скопировать содержимое элемента сотрудников и его потомков в элемент отдела.

  6. Сохраните изменения в файле, а затем используйте процессор XSLT 2.0 для генерацииРезультат документа horizons.xml путем применения шаблона getEmployees в таблице стилей alldepartments.xsl.

<xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     exclude-result-prefixes="xs">


<xsl:output method="xml" encoding="UTF-8" indent="yes" />

<xsl:template name="getEmployees">
  <xsl:variable name="depts" select="('a00', 'c01', 'd11', 'd21', 'e11', 'e21')" as="xs:string" />
  <departments>
    <xsl:for-each select="$depts">
      <xsl:variable name="currentDept">
        <xsl:value-of select="." />
      </xsl:variable>

      <department deptID="{$currentDept}">
        <xsl:value-of select="doc(concat('dept',$currentDept, '.xml'))" />
        <xsl:copy-of select="employees" />
      </department>
    </xsl:for-each>
  </departments>
</xsl:template>

</xsl:stylesheet>

Должен сгенерировать что-то похожее на:

<?xml version="1.0" encoding="UTF-8"?>
<departments>
   <department dept="a00">
      <employees>
         <employee empID="10">
            <firstName>Marylin</firstName>
            <middleInt>A</middleInt>
            <lastName>Johnson</lastName>
            <department>A00</department>
            <phone>3978</phone>
            <email>Johnson.60@example.com/horizons</email>
            <dateHired>2000-01-01</dateHired>
            <title>President</title>
            <edLevel>18</edLevel>
            <gender>F</gender>
            <birthDate>1968-08-24</birthDate>
            <salary>121300</salary>
            <bonus>2300</bonus>
            <commission>9700</commission>
         </employee>
         <employee empID="40">
            <firstName>Heather</firstName>
            <middleInt>D</middleInt>
            <lastName>Gordon</lastName>
            <department>A00</department>
            <phone>3915</phone>
            <email>Gordon.59@example.com/horizons</email>
            <dateHired>2009-03-01</dateHired>
            <title>Manager</title>
            <edLevel>18</edLevel>
            <gender>F</gender>
            <birthDate>1986-06-03</birthDate>
            <salary>85400</salary>
            <bonus>1700</bonus>
            <commission>6500</commission>
         </employee>
      </employees>
   </department>
</departments>

1 Ответ

0 голосов
/ 05 мая 2019

Если вы используете атрибут as в xsl:variable для объявления типа вашей переменной, то выбранное вами значение должно соответствовать этому объявлению, поэтому, учитывая, что у вас есть последовательность строк, вам необходимо использовать <xsl:variable name="depts" select="('a00', 'c01', 'd11', 'd21', 'e11', 'e21')" as="xs:string*" />.

Дополнительно

    <xsl:copy-of select="employees" />

внутри for-each над последовательностью строк не имеет смысла (и объясняет ошибку, которую вы получаете после исправления типа переменной), там вы просто хотите

    <xsl:copy-of select="doc(concat('dept', ., '.xml'))/employees" />
...