如果父节点中的XSLT包装输入XML,只有在它不存在的情况下才能使用它?
例如,如果我的输入是:
<Project>...</Project>
我想用前缀和后缀包装它:
<?xml version "1.0" encoding="utf-8">
<Site>
<Project>...</Project>
</Site>
但是,如果&lt; Project&gt;不是输入的根节点,我希望输入保持不变。
提前致谢!
答案 0 :(得分:4)
此样式表:
<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>
注意:身份转换。模式匹配
答案 1 :(得分:1)
此转化:
<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>
答案 2 :(得分:0)
如果只需要添加前缀和后缀,那么你可以寻找其他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>