我对XSLT有疑问。
据我所知,XSLT可用于将XML转换为另一种XML。
假设有一个名为data.xml
<data>
<field>
<attr>Attribute 1</attr>
<attr>Attribute 2</attr>
</field>
</data>
假设有一个名为transform.xsl
和another.xsl
的xsl文件
两个文件都以类似的方式定义了如何转换data.xml
。
transform.xsl
包括another.xsl
假设我想让transform.xsl
转换为foo.html
并让另一个xsl的转换追加到foo.html
,是否有人知道如何通过任何机会实现这一点? ?
我现在遇到的另一个问题是,因为<xsl:include>
可以覆盖模板,所以只有一个会生效。是否可以使同一<xsl:template>
多次调用?
答案 0 :(得分:1)
您可以使用模式区分处理步骤(<xsl:template match="field" mode="m1">...</xsl:template>
和<xsl:template match="data"><xsl:apply-templates select="field" mode="m1"/></xsl:template>
),但当然需要创作another.xsl
或编辑它以使用模式。
作为第二个,虽然您已将问题标记为XSLT 2.0,但您还可以选择使用<xsl:next-match/>
,请参阅http://www.w3.org/TR/xslt20/#element-next-match。
为了给你一个使用模式的例子,主样式表是
<xsl:stylesheet version="2.0" exclude-result-prefixes="xs"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:include href="test2013080802.xsl"/>
<xsl:output method="html" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<html lang="en">
<head>
<title>Example</title>
</head>
<body>
<h1>Example</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="data">
<table>
<thead>
<xsl:apply-templates select="field[1]" mode="thead"/>
</thead>
<tbody>
<xsl:apply-templates/>
</tbody>
</table>
<xsl:apply-templates select="." mode="list"/>
</xsl:template>
<xsl:template match="field" mode="thead">
<tr>
<xsl:apply-templates mode="thead"/>
</tr>
</xsl:template>
<xsl:template match="field/*" mode="thead">
<th><xsl:value-of select="local-name()"/></th>
</xsl:template>
<xsl:template match="field">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="field/*">
<td><xsl:value-of select="."/></td>
</xsl:template>
</xsl:stylesheet>
包含然后使用名为list
的模式:
<xsl:stylesheet version="2.0" exclude-result-prefixes="xs"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/" mode="list">
<html lang="en">
<head>
<title>Example</title>
</head>
<body>
<h1>Example</h1>
<xsl:apply-templates mode="#current"/>
</body>
</html>
</xsl:template>
<xsl:template match="data" mode="list">
<ul>
<xsl:apply-templates mode="#current"/>
</ul>
</xsl:template>
<xsl:template match="field" mode="list">
<li>
<xsl:apply-templates select="*" mode="#current"/>
</li>
</xsl:template>
<xsl:template match="field/*" mode="list">
<xsl:if test="position() > 1">, </xsl:if>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
然后输出
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Example</title>
</head>
<body>
<h1>Example</h1>
<table>
<thead>
<tr>
<th>attr</th>
<th>attr</th>
</tr>
</thead>
<tbody>
<tr>
<td>Attribute 1</td>
<td>Attribute 2</td>
</tr>
</tbody>
</table>
<ul>
<li>Attribute 1, Attribute 2</li>
</ul>
</body>
</html>