使用XSLT循环遍历XML元素并调用另一个xsl



我正在使用XSL转换循环遍历不同的XML元素。以下是我的示例xml:

<?xml version="1.0" encoding="UTF-8"?>    
<Alerts>    
<AlertType>
<AlertTypeOne>
<NewAlert></NewAlert>
</AlertTypeOne>                
</AlertType>
<AlertType>
<AlertTypeTwo>
<NewerAlert></NewerAlert>
</AlertTypeTwo>            
</AlertType>
<AlertType>
<AlertTypeThree>
<OldAlert></OldAlert>
</AlertTypeThree>              
</AlertType>
</Alerts>

以下是我的xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h1>Alerts</h1>
<table>
<tr>
<td>Credit Monitoring Activity</td>
</tr>
<tr>
<td>Lorem ipsum <br/>
<xsl:for-each select="//Alerts/AlertType">
<!--logic -->
</xsl:for-each></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

我正在迭代不同的AlertType标记。AlertType标记可能包含不同的xml(彼此不相关),基于标记中的第一个元素,我想调用适当的xsl文件并将xml内容传递给它(就像java中的方法调用一样)。

目前,我无法访问AlertType标记的直属子节点,更不用说匹配它了。有人能帮助我如何访问子节点吗?此外,根据匹配结果(使用for each),我想调用不同的xslt。知道怎么做吗?

编辑由于xml包含不同警报的信息,我希望显示一个由多个表组成的HTML文件(每个警报一个表)。根据标签中的不同数据,列的名称和值可能不同。

HTML应该是这样的:

信用监控活动

AlertTypeOne
名称地址城市州

数据数据数据

AlertType Two

资格指定角色

数据数据

AlertTypeThree

贷方-借方

数据数据

您询问的是您的解决方案,而不是确定您试图解决的问题(请参阅此处meta上的"XY"帖子)。

xsl:for-each在很多地方都是不合适的,它经常被具有过程背景的程序员滥用。相反,你应该采用功能范式。使用xsl:templatexsl:apply-templates被认为是一种函数方法。

在您的情况下,没有必要使用xsl:for-each。相反,为输入XML中的元素编写单独的模板。例如,从以下内容开始:

编辑

作为对您编辑的回应:

我想显示一个由多个表组成的HTML文件(每个警报一个表)。

然后,在匹配各个警报的模板中包括<table>(我已经编辑了代码)。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<h1>Alerts</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>

然后,为AlertsAlertType等编写模板:

<xsl:template match="Alerts|AlertType">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="AlertTypeOne">
<table>
<!--Decide what to do with this element here-->
</table>
</xsl:template>

不幸的是,您没有透露您想要的输出HTML的样子。

基于标记内的第一个元素,我想调用适当的xsl文件

我认为您不需要单独的XSL文件;您可以根据不同的AlertType元素的子元素,将不同的模板(在同一样式表中)应用于它们。以下样式表将为每个AlertType元素创建一个表,然后应用适当的模板来构建表的结构(和内容,如果有的话):

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<h1>Alerts</h1>
<xsl:for-each select="Alerts/AlertType">
<table>
<xsl:apply-templates/>
</table>
</xsl:for-each>
</body>
</html>
</xsl:template>
<xsl:template match="AlertTypeOne">
<tr>
<th>Name</th>
<th>Address</th>
<th>City</th>
<th>State</th>
</tr>
<tr>
<td><!--logic --></td>
<td><!--logic --></td>
<td><!--logic --></td>
<td><!--logic --></td>
</tr>
</xsl:template>
<xsl:template match="AlertTypeTwo">
<tr>
<th>Qualification</th>
<th>Designation</th>
<th>Role</th>
</tr>
<tr>
<td><!--logic --></td>
<td><!--logic --></td>
<td><!--logic --></td>
</tr>
</xsl:template>
<xsl:template match="AlertTypeThree">
<tr>
<th>Credit</th>
<th>Debit</th>
</tr>
<tr>
<td><!--logic --></td>
<td><!--logic --></td>
</tr>
</xsl:template>
</xsl:stylesheet>

应用于您的示例输入:

<?xml version="1.0" encoding="UTF-8"?>    
<Alerts>    
<AlertType>
<AlertTypeOne>
<NewAlert></NewAlert>
</AlertTypeOne>                
</AlertType>
<AlertType>
<AlertTypeTwo>
<NewerAlert></NewerAlert>
</AlertTypeTwo>            
</AlertType>
<AlertType>
<AlertTypeThree>
<OldAlert></OldAlert>
</AlertTypeThree>              
</AlertType>
</Alerts>

接收到以下输出:

<?xml version="1.0" encoding="utf-8"?>
<html>
<body>
<h1>Alerts</h1>
<table>
<tr>
<th>Name</th>
<th>Address</th>
<th>City</th>
<th>State</th>
</tr>
<tr>
<td/>
<td/>
<td/>
<td/>
</tr>                
</table>
<table>
<tr>
<th>Qualification</th>
<th>Designation</th>
<th>Role</th>
</tr>
<tr>
<td/>
<td/>
<td/>
</tr>            
</table>
<table>
<tr>
<th>Credit</th>
<th>Debit</th>
</tr>
<tr>
<td/>
<td/>
</tr>              
</table>
</body>
</html>

相关内容

  • 没有找到相关文章

最新更新