XSL-XML循环

XSL-XML循环,xml,xslt,Xml,Xslt,我有一个XML文件,我正在使用XSL将其转换为html页面。我希望遍历包含许多父节点的XML文件,然后遍历子节点并在HTML表中显示结果 到目前为止,我能够循环父节点并成功返回它们,但当我在其中为每个循环嵌套一个,以返回子节点的属性时,我最终返回文档中所有子节点的属性,而不是特定于父节点的属性 有人能解释一下吗 XML: XSL: 管理报告编号: 数据报告ID: 你太复杂了 选择与当前上下文节点相关: <table border="1" cellspacing="2" width="

我有一个XML文件,我正在使用XSL将其转换为html页面。我希望遍历包含许多父节点的XML文件,然后遍历子节点并在HTML表中显示结果

到目前为止,我能够循环父节点并成功返回它们,但当我在其中为每个循环嵌套一个,以返回子节点的属性时,我最终返回文档中所有子节点的属性,而不是特定于父节点的属性

有人能解释一下吗

XML:


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。我们都走同一条路。