我有一个转换(简化版)是这样的:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="head">
<xsl:element name="head">
<xsl:element name="title">
<xsl:text>Transformed document</xsl:text>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="body">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
转换样本HTML文档
<?xml version="1.0" encoding="iso-8859-1"?>
<html xml:lang="en" lang="en">
<head>
<title>Sample page</title>
<link rel="stylesheet" href="/style.css" type="text/css"/>
<meta name="author" content="John Doe"></meta>
</head>
<body>
<h1>Header</h1>
<p>Some text</p>
<p>Some other text</p>
</body>
</html>
至:
<?xml version="1.0" encoding="UTF-8"?><html lang="en" xml:lang="en">
<head><title>Transformed document</title></head>
<body>
<h1>Header</h1>
<p>Some text</p>
<p>Some other text</p>
</body>
</html>
我不明白为什么我需要两次调用apply-templates。据我了解,第一个应将所有内容复制到输出(包括head,应将其覆盖),第二个应仅复制正文(这是我想要的)。但是,两者似乎都是必要的。如果我从正文中删除该文本,则输出中只有头,如果我删除第一个,则仅从节点中提取文本,而不是从节点中提取文本。
为什么在下面的示例中<xsl:apply-templates select="@* | node()"/>
需要两次,并且可以简化该示例?
这里的问题不是调用xsl:apply-templates
两次,而是有一个多余的整个模板。
由于您没有body
进行任何更改,因此可以让它由身份转换模板(您的第一个模板)处理,然后删除最后一个模板:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="head">
<xsl:element name="head">
<xsl:element name="title">
<xsl:text>Transformed document</xsl:text>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
顺便说一句,您还可以将模板匹配简化head
为:
<xsl:template match="head">
<head>
<title>Transformed document</title>
</head>
</xsl:template>
xsl:element
如果事先知道元素名称,则无需使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句