仅当父节点不存在时,如何让 XSLT 将输入 XML 包装在父节点中?
例如,如果我的输入是:
<Project>...</Project>
我想用前缀和后缀包装它:
<?xml version "1.0" encoding="utf-8">
<Site>
<Project>...</Project>
</Site>
但是,如果 <Project> 不是输入的根节点,我希望输入保持不变。
提前致谢!
这个样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Project">
<Site>
<xsl:call-template name="identity"/>
</Site>
</xsl:template>
</xsl:stylesheet>
输入 1:
<Project>...</Project>
输出 1:
<Site>
<Project>...</Project>
</Site>
输入 2:
<Root>
<Project>...</Project>
</Root>
输出 2:
<Root>
<Project>...</Project>
</Root>
注意:身份转换。模式匹配
这种转变:
<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()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(self::site)]/Project">
<site>
<xsl:call-template name="identity"/>
</site>
</xsl:template>
</xsl:stylesheet>
<Project>
仅当元素还不是元素的子元素时才包装<site>
元素。
应用于此 XML 文档时:
<t>
<Project>x</Project>
<site>
<Project>y</Project>
</site>
</t>
产生了正确的,想要的结果:
<t>
<site>
<Project>x</Project>
</site>
<site>
<Project>y</Project>
</site>
</t>
如果只添加前缀和后缀是您的要求,那么您可以寻找其他 Unix 选项,例如 grep,它可以更简单地完成此操作。如果您想在 XSL 中执行此操作,那么您应该使用 xsl:when
<xsl:template match="/">
<xsl:choose> <!-- If Node Period exists add the text --> <xsl:when test="Period">
<xsl:text><Site></xsl:text>
<xsl:text>
</xsl:text>
<xsl:text><Site></xsl:text>
</xsl:when> </xsl:choose> <xsl:apply-templates select="Notification"/> </xsl:template>