首页 > 解决方案 > xsl:for-每个具有属性的元素

问题描述

我有这个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>

标签: xmlxslt

解决方案


您缺少元素上的名称空间。所以在你的元素
上定义一个命名空间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>

可以删除包装模板。
结果如所愿。


推荐阅读