假设我有这个xml:
<college>
<student>
<name>amit</name>
<file>/abc/kk/final.c</file>
<rollno>22</rollno>
</student>
<student>
<name>sumit</name>
<file>/abc/kk/up.h</file>
<rollno>23</rollno>
</student>
<student>
<name>nikhil</name>
<file>/xyz/up.cpp</file>
<rollno>24</rollno>
</student>
<student>
<name>bharat</name>
<file>/abc/kk/down.h</file>
<rollno>25</rollno>
</student>
<student>
<name>ajay</name>
<file>/simple/st.h</file>
<rollno>27</rollno>
</student>
</college>
我在“.xsl”中使用for-each来显示节点的所有条目,但我只想显示那些文件名以“/ abc / kk”开头的那些节点的条目,因为我是新的到xslt ..
请给我解决方案。
我正在使用:
<xsl:for-each select="college/student">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="file"/></td>
<td><xsl:value-of select="rollno"/></td>
</tr>
答案 0 :(得分:6)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="student[starts-with(file,'/abc/kk')]">
<tr><xsl:apply-templates/></tr>
</xsl:template>
<xsl:template match="student/*">
<td><xsl:apply-templates/></td>
</xsl:template>
<xsl:template match="student"/>
</xsl:stylesheet>
应用于提供的XML文档时:
<college>
<student>
<name>amit</name>
<file>/abc/kk/final.c</file>
<rollno>22</rollno>
</student>
<student>
<name>sumit</name>
<file>/abc/kk/up.h</file>
<rollno>23</rollno>
</student>
<student>
<name>nikhil</name>
<file>/xyz/up.cpp</file>
<rollno>24</rollno>
</student>
<student>
<name>bharat</name>
<file>/abc/kk/down.h</file>
<rollno>25</rollno>
</student>
<student>
<name>ajay</name>
<file>/simple/st.h</file>
<rollno>27</rollno>
</student>
</college>
会产生想要的正确结果:
<tr>
<td>amit</td>
<td>/abc/kk/final.c</td>
<td>22</td>
</tr>
<tr>
<td>sumit</td>
<td>/abc/kk/up.h</td>
<td>23</td>
</tr>
<tr>
<td>bharat</td>
<td>/abc/kk/down.h</td>
<td>25</td>
</tr>
<强>解释强>:
匹配任何student
个file
子项的模板,其字符串值以'/ abc / kk'开头。这只是将生成的内容放在包装器tr
元素中。
匹配任何没有正文的student
的模板并有效删除它(不会将此元素复制到输出中)。此模板的优先级低于第一个,因为第一个模板更具体。因此,只有第一个模板未匹配的student
元素才会使用第二个模板进行处理。
匹配任何student
元素的所有子元素的模板。这只是将内容包装成td
元素。
答案 1 :(得分:3)
像这样:
<xsl:for-each select="college/student[starts-with(file, '/abc/kk')]">
<!-- ... -->
括号[ ]
分隔“过滤器”,在该过滤器中,您可以使用starts-with()
答案 2 :(得分:0)
您也可以在[..]
中使用match
:
<xsl:template match="college/student[starts-with(file, '/abc/kk')]">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="file"/></td>
<td><xsl:value-of select="rollno"/></td>
</tr>
</xsl:template>