XSL-XML循环
我有一个XML文件,我正在使用XSL将其转换为html页面。我希望遍历包含许多父节点的XML文件,然后遍历子节点并在HTML表中显示结果 到目前为止,我能够循环父节点并成功返回它们,但当我在其中为每个循环嵌套一个,以返回子节点的属性时,我最终返回文档中所有子节点的属性,而不是特定于父节点的属性 有人能解释一下吗 XML:XSL-XML循环,xml,xslt,Xml,Xslt,我有一个XML文件,我正在使用XSL将其转换为html页面。我希望遍历包含许多父节点的XML文件,然后遍历子节点并在HTML表中显示结果 到目前为止,我能够循环父节点并成功返回它们,但当我在其中为每个循环嵌套一个,以返回子节点的属性时,我最终返回文档中所有子节点的属性,而不是特定于父节点的属性 有人能解释一下吗 XML: XSL: 管理报告编号: 数据报告ID: 你太复杂了 选择与当前上下文节点相关: <table border="1" cellspacing="2" width="
XSL:
管理报告编号:
数据报告ID:
你太复杂了
选择
与当前上下文节点相关:
<table border="1" cellspacing="2" width="800" bgcolor="white">
<xsl:for-each select="/*/*[name()='AdminReport']">
<tr bgcolor="9acd32">
<table><th>Admin Report Num:</th></table>
<table><th><xsl:value-of select="@ID"/> </th></table>
</tr>
<tr>
<xsl:for-each select="*[name()='DataSourceInformation']">
<table><th>Data Report ID:</th></table>
<table><th><xsl:value-of select="@DataSourceID"/></th></table>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
管理报告编号:
数据报告ID:
你太复杂了
选择
与当前上下文节点相关:
<table border="1" cellspacing="2" width="800" bgcolor="white">
<xsl:for-each select="/*/*[name()='AdminReport']">
<tr bgcolor="9acd32">
<table><th>Admin Report Num:</th></table>
<table><th><xsl:value-of select="@ID"/> </th></table>
</tr>
<tr>
<xsl:for-each select="*[name()='DataSourceInformation']">
<table><th>Data Report ID:</th></table>
<table><th><xsl:value-of select="@DataSourceID"/></th></table>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
管理报告编号:
数据报告ID:
的值和选择之间没有空格
<xsl:value-ofselect="@ID"/>
它应该是
的值和选择之间没有空格
<xsl:value-ofselect="@ID"/>
应该是
这可以使用模板而不是为每个更干净地完成:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="30/11/2011 09:25:58">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<table border="1" cellspacing="2" width="800" bgcolor="white">
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="x:AdminReport">
<tr bgcolor="9acd32">
<table><th>Admin Report Num:</th></table>
<table><th><xsl:value-of select="@ID"/></th></table>
</tr>
<tr><xsl:apply-templates/></tr>
</xsl:template>
<xsl:template match="x:DataSourceInformation">
<table><th>Data Report ID:</th></table>
<table><th><xsl:value-of select="@DataSourceID"/></th></table>
</xsl:template>
</xsl:stylesheet>
管理报告编号:
数据报告ID:
注释:
- 每个部分都有自己的模板,模板可以更清晰地构造样式表
- 将来使用这种方法将更容易处理新元素
- 我将您的命名空间注册到前缀
x
,这样我就可以引用x:DataSourceInformation
之类的元素,而不是*[name()='DataSourceInformation']
- XSLT中很少需要为每个
使用;模板几乎总是更自然的解决方案
如果你坚持对每个
都使用,那么请看@GSerg的答案
可以使用模板而不是为每个
更干净地完成此操作:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="30/11/2011 09:25:58">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<table border="1" cellspacing="2" width="800" bgcolor="white">
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="x:AdminReport">
<tr bgcolor="9acd32">
<table><th>Admin Report Num:</th></table>
<table><th><xsl:value-of select="@ID"/></th></table>
</tr>
<tr><xsl:apply-templates/></tr>
</xsl:template>
<xsl:template match="x:DataSourceInformation">
<table><th>Data Report ID:</th></table>
<table><th><xsl:value-of select="@DataSourceID"/></th></table>
</xsl:template>
</xsl:stylesheet>
管理报告编号:
数据报告ID:
注释:
- 每个部分都有自己的模板,模板可以更清晰地构造样式表
- 将来使用这种方法将更容易处理新元素
- 我将您的命名空间注册到前缀
x
,这样我就可以引用x:DataSourceInformation
之类的元素,而不是*[name()='DataSourceInformation']
- XSLT中很少需要为每个
使用;模板几乎总是更自然的解决方案
如果你坚持对每个
都使用,那么请看@GSerg的答案
更容易将XSLT视为声明性模板匹配引擎。查看本示例中的xsl:template和xsl:apply-template元素。致以最良好的祝愿
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="30/11/2011 09:25:58">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/ns:AdminReports">
<table border="1" cellspacing="2" width="800" bgcolor="white">
<xsl:apply-templates select="ns:AdminReport"/>
</table>
</xsl:template>
<xsl:template match ="ns:AdminReport">
<tr bgcolor="9acd32">
<th>Admin Report Num:</th>
<th>
<xsl:value-of select="@ID"/>
</th>
</tr>
<tr>
<xsl:apply-templates select="ns:DataSourceInformation" />
</tr>
</xsl:template>
<xsl:template match="ns:DataSourceInformation" >
<table>
<th>Data Report ID:</th>
</table>
<table>
<th>
<xsl:value-of select="@DataSourceID"/>
</th>
</table>
</xsl:template>
</xsl:stylesheet>
管理报告编号:
数据报告ID:
更容易将XSLT视为声明性模板匹配引擎。查看本示例中的xsl:template和xsl:apply-template元素。致以最良好的祝愿
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="30/11/2011 09:25:58">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/ns:AdminReports">
<table border="1" cellspacing="2" width="800" bgcolor="white">
<xsl:apply-templates select="ns:AdminReport"/>
</table>
</xsl:template>
<xsl:template match ="ns:AdminReport">
<tr bgcolor="9acd32">
<th>Admin Report Num:</th>
<th>
<xsl:value-of select="@ID"/>
</th>
</tr>
<tr>
<xsl:apply-templates select="ns:DataSourceInformation" />
</tr>
</xsl:template>
<xsl:template match="ns:DataSourceInformation" >
<table>
<th>Data Report ID:</th>
</table>
<table>
<th>
<xsl:value-of select="@DataSourceID"/>
</th>
</table>
</xsl:template>
</xsl:stylesheet>
管理报告编号:
数据报告ID:
为什么要这么多次编写***
?这是一个奇怪的名称空间。名称空间上的XML规则非常混乱。有些工具/解析器可能会让你逍遥法外,但迟早你会发现一个没有。为什么**
会被写这么多次?这是一个奇怪的名称空间。名称空间上的XML规则非常混乱。有些工具/解析器可能会让你逍遥法外,但迟早你会找到一个不会的。谢谢。这正是我所需要的。当然,/*/*[name()='AdminReport']
可以而且应该简化为/*/n:AdminReport
,其中前缀n绑定到相关的命名空间。@MichaelKay是的。但据我所知,文档中有许多AdminReports
,每个报告都有一个唯一的xmlns
(xmlns
对于datetime来说有些奇怪)。这将证明OP在他的XSL.Thank中所做的努力是合理的。这正是我所需要的。当然,/*/*[name()='AdminReport']
可以而且应该简化为/*/n:AdminReport
,其中前缀n绑定到相关的命名空间。@MichaelKay是的。但据我所知,文档中有许多AdminReports
,每个报告都有一个唯一的xmlns
(xmlns
对于datetime来说有些奇怪)。这将证明OP在XSL.Nice summary@lwburk中所做的努力是合理的。我们都走同一条路。很好的总结@lwburk。我们都走同一条路。