xsl:for-each具有属性的元素

时间:2018-10-22 18:36:22

标签: xml xslt

我有这个xml

<Books>
<Book Cover="Audiobook" xmlns="http://tempuri.org/XMLSchema.xsd">
  <Title>Middlesex: A Novel</Title>
  <FBT>The Woman Warrior</FBT>
  <FBT>The House on Mango Street</FBT>
  <Isbn>0312427735</Isbn>
  <Author>
    <Name>
      <First>Jeffrey</First>
      <Last>Eugenides</Last>
    </Name>
    <Contact Office="Office1">
      <Phone>110-222-3333</Phone>
    </Contact>
  </Author>
  <Publisher>Picador</Publisher>
  <Year Edition="1">2002</Year>
</Book>
<Book Cover="Audiobook" xmlns="http://tempuri.org/XMLSchema.xsd">
  <Title>Me Talk Pretty One Day</Title>
  <FBT>Dress Your Family in Corduroy and Denim</FBT>
  <FBT>Naked</FBT>
  <Isbn>9780316776967</Isbn>
  <Author>
    <Name>
      <First>David</First>
      <Last>Sedaris</Last>
    </Name>
    <Contact Office="Office1">
      <Phone>119-222-3333</Phone>
    </Contact>
   </Author>
  <Publisher>Back Bay Books</Publisher>
  <Year Edition="2">2001</Year>
 </Book>
</Books>

我遇到的主要问题是当我尝试在xslt代码中进行迭代

<xsl:for-each select="Books/Book">

它不会传递到我提到的任何书籍中。我尝试查找为什么这可能是问题所在,但仍不确定我是否从其中一个书本实例中删除了属性,它最终能够传递给子元素,因此可以将数据放入表中。 我的第一个问题是,为什么在book元素中包含属性甚至会对我的for-each产生影响?

第二个可以解决这个问题的方法吗?我想将属性保留在书中。

编辑:这是我执行循环的部分

 <xsl:for-each select="Books/Book">
          <tr style="font-size: 12pt; font-family: verdana">
            <td>

              <xsl:value-of select="Title"/>

            </td>
            <td>
              <xsl:value-of select="Isbn"/>
            </td>
            <td>
              <xsl:value-of select="Author"/>
            </td>
            <td>
              <xsl:value-of select="Publisher"/>
            </td>
            <td>
              <xsl:value-of select="Year"/>
            </td>
          </tr>
        </xsl:for-each>

2 个答案:

答案 0 :(得分:1)

您缺少元素上的名称空间。
因此,使用{p>在您的xsl:stylesheet元素上定义一个名称空间

xmlns:bk="http://tempuri.org/XMLSchema.xsd"

设置为Book元素的默认值,使其成为

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

然后将其更改为

<xsl:template match="/">
  <xsl:for-each select="Books/bk:Book">
      <tr style="font-size: 12pt; font-family: verdana">
        <td>
          <xsl:value-of select="bk:Title"/>
        </td>
        <td>
          <xsl:value-of select="bk:Isbn"/>
        </td>
        <td>
          <xsl:value-of select="concat(bk:Author/bk:Name/bk:First,' ', bk:Author/bk:Name/bk:Last)"/>
        </td>
        <td>
          <xsl:value-of select="bk:Publisher"/>
        </td>
        <td>
          <xsl:value-of select="bk:Year"/>
        </td>
      </tr>
  </xsl:for-each>
</xsl:template>

包装模板可以删除。
结果如预期。

答案 1 :(得分:0)

好像您使用的是正确的语法

 <xsl:for-each select="Books/Book">
     <xsl:value-of select="Title" />
     <xsl:value-of select="FBT" /> 
 </xsl:for-each>

如果使用相同的方法,则应该可以从XML中获取标题和FBT。如果可能,请尝试在表格中填充完整的XML,然后检查哪里出错了。从语法的角度来看,根据W3School

是正确的

令人惊讶的是,以下XML可以正常工作,名称空间可能存在问题(xmlns =“ http://tempuri.org/XMLSchema.xsd”)。请检查一次...

    <Books>
<Book Cover="Audiobook" xmlns="http://tempuri.org/XMLSchema.xsd">
  <Title>Middlesex: A Novel</Title>
  <FBT>The Woman Warrior</FBT>
  <FBT>The House on Mango Street</FBT>
  <Isbn>0312427735</Isbn>
  <Author>
    <Name>
      <First>Jeffrey</First>
      <Last>Eugenides</Last>
    </Name>
    <Contact Office="Office1">
      <Phone>110-222-3333</Phone>
    </Contact>
  </Author>
  <Publisher>Picador</Publisher>
  <Year Edition="1">2002</Year>
</Book>
<Book Cover="Audiobook" xmlns="http://tempuri.org/XMLSchema.xsd">
  <Title>Me Talk Pretty One Day</Title>
  <FBT>Dress Your Family in Corduroy and Denim</FBT>
  <FBT>Naked</FBT>
  <Isbn>9780316776967</Isbn>
  <Author>
    <Name>
      <First>David</First>
      <Last>Sedaris</Last>
    </Name>
    <Contact Office="Office1">
      <Phone>119-222-3333</Phone>
    </Contact>
   </Author>
  <Publisher>Back Bay Books</Publisher>
  <Year Edition="2">2001</Year>
 </Book>
</Books>