[英]Match any node in XML document using XSLT even if I don't know the names of the nodes
当我不知道节点的名称时,如何使用XSTL转换XML文档。 所以基本上它应该普遍适用于任何XML文档。
假设我得到了这个XML文档:
<?xml version="1.0"?>
<?xml-stylesheet href="transform.xsl" type="text/xsl" ?>
<!DOCTYPE cinema [
<!ELEMENT a (b*)>
<!ELEMENT b (c,d,e)>
<!ELEMENT c (#PCDATA)>
<!ELEMENT d (#PCDATA)>
<!ELEMENT e (#PCDATA)>
]>
<cinema>
<movie>
<actor>Some actor</actor>
<title>Some title</title>
<year>Some year</year>
</movie>
</cinema>
我将如何创建一个HTML表格呢? 我知道我可以像这样匹配根元素:
<xsl:template match="/">
然后我选择所有这样的电影:
<xsl:for-each select="/*/*">
但是我如何知道为每部电影获得一行,其中三列为演员,头衔和年份? 特别是因为XML文件(电影)应该只能有2个孩子或5个孩子。
+++编辑+++
如果我这样做:
<tr>
<td><xsl:value-of select="."/></td>
</tr>
我把每部电影的细节都放在一行。 这几乎接近我想要达到的目标。 但是如何在该行的三列中展开电影细节呢?
如果你知道你将永远有三个级别的元素(根,子和孙),那么这样的事情应该这样做:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:template match="/">
<html><body><xsl:apply-templates /></body></html>
</xsl:template>
<xsl:template match="/*">
<table><xsl:apply-templates /></table>
</xsl:template>
<xsl:template match="/*/*">
<tr><xsl:apply-templates /></tr>
</xsl:template>
<xsl:template match="/*/*/*">
<td><xsl:apply-templates /></td>
</xsl:template>
</xsl:stylesheet>
/
template匹配文档节点 , /*
匹配文档节点的第一级元素子节点(即文档的根元素), /*/*
匹配二级子节点等。
<xsl:apply-templates/>
(没有select
)将匹配模板应用于当前节点的所有子节点,其中包括子元素,文本节点,注释和处理指令。 因此,您可能需要根模板
<xsl:template match="/">
<html><body><xsl:apply-templates select="*" /></body></html>
</xsl:template>
仅选择子元素 。
示例XML:
<?xml version="1.0" encoding="utf-8"?>
<cinema>
<movie>
<actor>Some actor</actor>
<title>Some title</title>
<year>Some year</year>
</movie>
<movie>
<actor>Someother actor</actor>
<title>Someother title</title>
<year>Someother year</year>
</movie>
</cinema>
XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<table>
<xsl:for-each select="*/*">
<xsl:if test="position()=1">
<tr>
<th>actor</th>
<th>title</th>
<th>year</th>
</tr>
</xsl:if>
<tr>
<xsl:for-each select="actor|title|year">
<td>
<xsl:value-of select="."/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
输出:
<?xml version="1.0" encoding="utf-8"?>
<table>
<tr>
<th>actor</th>
<th>title</th>
<th>year</th>
</tr>
<tr>
<td>Some actor</td>
<td>Some title</td>
<td>Some year</td>
</tr>
<tr>
<td>Someother actor</td>
<td>Someother title</td>
<td>Someother year</td>
</tr>
</table>
用途 :
<xsl:template match="movie">
<!-- Specify your tr-producing code here -->
</xsl:template>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.