如何解决XSLT-仅在子级包含特定文本时显示
我对XSLT非常陌生。无法弄清楚,仅在子节点包含特定文本之一的情况下才显示特定行。
就我而言,我们有一个通话记录列表。电话号码可以是多种类型,但是我只想在电话号码类型是语音或短信时在表中显示它们。
我的XML
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="example.xsl"?>
<CallLogs>
<cInfoBj>
<phNoBJ>
<phNo>123</phNo>
<phTypeBj>
<phTypeName>VOICE</phTypeName>
</phTypeBj>
</phNoBJ>
</cInfoBj>
<cInfoBj>
<phNoBJ>
<phNo>456</phNo>
<phTypeBj>
<phTypeName>VOICE</phTypeName>
</phTypeBj>
<phTypeBj>
<phTypeName>SMS</phTypeName>
</phTypeBj>
</phNoBJ>
</cInfoBj>
<cInfoBj>
<phNoBJ>
<phNo>789</phNo>
<phTypeBj>
<phTypeName>SMS</phTypeName>
</phTypeBj>
</phNoBJ>
</cInfoBj>
<cInfoBj>
<phNoBJ>
<phNo>890</phNo>
<phTypeBj>
<phTypeName>FAX</phTypeName>
</phTypeBj>
</phNoBJ>
</cInfoBj>
</CallLogs>
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>
<table border="1">
<tr bgcolor="#9acd32">
<th>Phone Number</th>
<th>Type</th>
</tr>
<xsl:for-each select="/CallLogs/cInfoBj/phNoBJ">
<tr>
<td><xsl:value-of select="phNo"/></td>
<td>
<xsl:for-each select="phTypeBj">
<div><xsl:value-of select="phTypeName"/></div>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
解决方法
将xsl:for-each
更改为xsl:apply-templates
,并为其可以选择的不同内容定义模板规则:
<xsl:apply-templates select="/CallLogs/cInfoBj/phNoBJ"/>
然后
<xsl:template match="phNoBJ[.//phTypeName=('VOICE','SMS')]">
<tr>
<td><xsl:value-of select="phNo"/></td>
<td>
<xsl:for-each select="phTypeBj">
<div><xsl:value-of select="phTypeName"/></div>
</xsl:for-each>
</td>
</tr>
</xsl:template>
<xsl:template match="phNoBJ"/> <!-drop element if it doesn't match the conditions-->
模板规则是构造XSLT代码的惯用方式。如果您是初学者,那么每次发现自己写xsl:for-each
时,请考虑改用xsl:apply-templates
。
更改:
<xsl:for-each select="/CallLogs/cInfoBj/phNoBJ">
收件人:
<xsl:for-each select="/CallLogs/cInfoBj/phNoBJ[phTypeBj/phTypeName='VOICE' or phTypeBj/phTypeName='SMS']">
如果您不想为多种类型的数字列出其他类型,则可能需要向其他xsl:for-each
指令添加类似的谓词。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。