典型的XSL用法是:
XML1.xml -> *transformed using xsl* -> XML2.xml
Run Code Online (Sandbox Code Playgroud)
如果我想简单地镜像输入数据,那么XSL文档是怎样的?
例如:
XML1.xml -> *transformed using xsl* -> XML1.xml
Run Code Online (Sandbox Code Playgroud)
如果我想简单地镜像输入数据,那么XSL文档是怎样的?
这个问题有不止一个答案,但是所有这些答案都可以命名为"身份变换":
<xsl:copy-of select="/"/> 这是最短,最简单,最有效和最不灵活,不可扩展且无用的身份转换.
每个人都知道(或应该知道)的经典身份规则:
_
<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="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
这仍然是非常短的,单模板转换,这是一种更具可扩展性和有用的身份转换,也称为"身份规则".使用和覆盖标识转换是最基本和最强大的XSLT设计模式,允许在几行中解决常见副本和替换/重命名/删除/添加问题.也许xslt标签中90%以上的答案都使用这种形式的身份变换.
0.3.细粒度的控制身份规则,每个人都应该知道(很少有人知道):
<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="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*|node()[1]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
这类似于上面2中定义的通常已知的身份规则,但它提供了对XSLT处理的更精细控制.
通常用2. <xsl:apply-templates select="@*|node()">触发许多转换(对于所有属性和子节点),可以按任何顺序或甚至并行完成.有些任务我们不希望在某些其他节点之后处理某些类型的节点,因此我们必须检测身份规则的泄漏,并使用与不需要的节点匹配的空模板覆盖它并在特定模式下添加其他模板在"时机成熟"时处理这些节点......
0.3.更适合我们想要更多控制和真正顺序类型处理的任务.使用2很难解决的一些任务很容易使用3.