为什么我得到变量$ depts的必需基数恰好是1;提供的价值的基数不止一个

时间:2019-05-05 08:45:44

标签: xslt-2.0

试图在这里找到一些作业,在线老师从未回答过我提出的任何问题。 尝试处理xml文档时,我总是收到错误消息。 “ XTTE0570:所需变量$ depts的基数恰好为1;提供的值的基数不止一个”

案例问题说明:

  1. 首先,创建一个名为getemployees的模板。

  2. 在getEmployees模板中,创建一个名为depts的变量,其中包含以下文本字符串的序列,这些字符串表示Lucy的示例数据的部门代码:'a00','c01','d11','d21',' e11”和“ e21”。

  3. 在创建depts变量的行之后,创建department元素。

  4. 在department元素内,插入一个for-each循环,该循环遍历 序列。

  5. 对于depts序列中的每个条目,请执行以下操作:

    a。创建一个名为currentDept的变量,该变量等于depts序列中的当前项目。

    b。使用名为deptiD的属性创建一个名为department的元素,该属性的值等于currentDept变量的值。

    c。使用doc()函数引用“ deptcurrent.xml”文件,其中current是currentDept变量的值。 (提示:使用concat()函数将“ dept”的文本字符串,currentDept变量和文本字符串“ .xml”组合在一起。)

    d。使用copy-of元素将employees元素及其后代的内容复制到department元素。

  6. 将更改保存到文件中,然后使用XSLT 2.0处理器生成结果 通过在alldepartments.xsl中应用getEmployees模板来文档horizo​​ns.xml 样式表。

<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 :(得分:0)

如果您在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" />