当前位置: 首页 > 知识库问答 >
问题:

通过子节点XSLT的后代具有模板循环

涂羽
2023-03-14

我对XML/XSLT非常陌生,很难理解通过根-子节点和子节点的中心节点的循环。

例如,我有一个链接到XSL文件的XML文件,在该XML文件中有几个包含decentant的子节点。见下文

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="TEST.xsl"?>
<student>
          <alumno id="001">
                    <nombre>Samuel</nombre>
                    <apellido>Van Bladel</apellido>
                    <email>Samuelvanbladel@gmail.com</email>
                    <foto><img width="800" height="800" alt="bla bla" src="test.png"/></foto> 
                    <expediente>NX0001R</expediente>
                    <curso>1</curso> 

                        <modulos>
                              <modulo1>
                                  <modulonom>daw1</modulonom>
                                  <nota>10</nota>
                                  <comentario>Muy bien hecho hasta el techo</comentario>
                              </modulo1>

                              <modulo2>
                                 <modulonom>daw2</modulonom>
                                  <nota>10</nota>
                                  <comentario>Muy bien hecho hasta el techo</comentario>                              
                              </modulo2>
                        </modulos>
         </alumno>
  </student>

我知道这里的层次结构是学生/校友/模/模1或模2,但当我想在XSL中循环它们时,我可以一直循环到学生/校友,或者如果我选择学生/校友/模,我可以循环到模,但我丢失了校友中的信息(姓名等),我理解这是预期的,因为我在模内,但我想知道如何才能循环这些信息所有这些都在一起。XSL如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body> 
</html>
</xsl:template>
<xsl:template match="alumno">
<p>
<xsl:apply-templates select="nombre"/>
<xsl:apply-templates select="apellido"/>
<xsl:apply-templates select="curso"/>
<xsl:apply-templates select="modulonom"/>
<xsl:apply-templates select="nota"/>
<xsl:apply-templates select="comentario"/>
</p>
</xsl:template>

<xsl:template match="nombre">
Nombre: <span style="color:#ff0000">
<xsl:value-of select="."/></span>
<br />
</xsl:template>

<xsl:template match="apellido">
Apellido: <span style="color:#00ff00">
<xsl:value-of select="."/></span>
<br />
</xsl:template>

<xsl:template match="curso">
Curso: <span style="color:#00ff00">
<xsl:value-of select="."/></span>
<br />
</xsl:template>


<xsl:template match="modulonom">
Nombre Modulo: <span style="color:#00ff00">
<xsl:for-each select="."/></span>
<br />
</xsl:template>

<xsl:template match="nota">
Nota: <span style="color:#00ff00">
<xsl:for-each select="."/></span>
<br />
</xsl:template>

<xsl:template match="comentario">
Comentario: <span style="color:#00ff00">
<xsl:for-each select="."/></span>
<br />
</xsl:template>


</xsl:stylesheet>


XML现在在浏览器中显示:

提名:塞缪尔·阿佩利多:范·布拉德尔·库索:1

但是我想看看节点内的所有信息

这篇文章的主要问题是:1。为什么它没有显示“Alumno”节点下的“Modulenom”/nota/“comentario”。从我所看到的情况来看,它可能和当前节点有关,它所在的节点是Alumno,但模在Alumno内部,这就是我的问题所在。3、如果可能的话,我如何解决这个问题?

已经非常感谢了

共有1个答案

凤晨朗
2023-03-14

简而言之,您的指示是:

<xsl:apply-templates select="comentario"/>

是在校友的背景下发布的,并且科门塔里奥不是校友的子女。因此,永远不会应用模板匹配。

更长的答案取决于你想要得到什么作为输出——但是你没有回答我的问题。总的来说,我建议你研究XSLT处理模型。

 类似资料:
  • 我正在研究一个xslt,它将用于翻译一组xmls文件,一个示例输入xml类似于:- 我想通过创建属性为id=“A12”的节点“book”的副本对其进行转换,条件是,如果属性为id=AA12的节点book不存在,则创建节点“book”的副本(属性为id=“A12”),并在副本中将id更改为“AA12”(因此其属性值更改的节点副本),但如果属性为book的节点(id=“AA12”)已经存在于xml中,

  • 我正在尝试为封装在父元素中但具有不同元素名称的元素使用应用模板。在我的示例中,我想将其应用于元素,并选择其中任何一个具有值。此任务是我问的另一个问题的延续。我使用以下XML 我正在使用java应用以下XSLT 1.0。在上面的示例中,我希望模板应用于firstName和lastName,但在firstName中显示值,因为它是第一个有值的。 Java代码是Oracle tuorial页面示例中的S

  • 我需要将子元素复制到父元素中。 输入 期望输出 我尝试的内容(输出与输入保持相同): 我肯定会错过一些非常简单的事情。子元素与父元素具有相同的名称,这应该不是问题?

  • 我想从父节点复制到子节点。我真的不确定这是如何实现的。 我的源xml 我想得到输出为 我想要XSLT1.0中的解决方案。 我想将这些节点复制到子节点 谢谢。

  • 我需要以下xslt代码方面的帮助。我的意见如下: 我的预期输出为: 我曾尝试使用*/text()获取值节点的值,但我只从第一个孩子获得文本。将来我有很多这样的子元素。 提前谢谢。 你好,Minakshi

  • 我已经实现了一个TreeModel来调整存量数据模型,以便将其可视化为JTree。我遇到了一个问题,节点有多个相同的子(叶)节点。例如,考虑一个JTree,它的叶节点是Strings。每当父节点包含具有相同String值的子节点时,就会出现问题。这些叶节点的TreePath是相同的,作为Strings,equals()返回true。留档明确地调用这个: JTree及其相关类广泛使用TreePath