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