xml - 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>
解决方案
您缺少元素上的名称空间。所以在你的元素
上定义一个命名空间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>
可以删除包装模板。
结果如所愿。
推荐阅读
- jquery - printThis.js 没有选择正确的表输入值
- python - 经过训练的 ANN 模型无法正确预测测试数据
- javascript - jQuery问题中具有放大缩放功能的模态
- c# - 可空嵌套映射
- javascript - 尽管存在数据,AJAX Post 仍失败
- c# - 如何使用 azure AD 访问令牌绕过微软在线登录?
- android - 如何创建自定义字符串并动态填充它?
- amazon-ec2 - 在多个 EC2 实例上运行的同一个 Kinesis Consumer
- java - JTree 未显示在 SplitPane 的左侧 ScrollPane 内
- c - 在接受 1 个输入后将结构写入文件,导致分段错误