如何在父节点中包含XSLT包装输入XML,仅当它尚不存在?追加页眉和页脚,如果它们不存在与XSLT
例如,如果我输入的是:
<Project>...</Project>
我想用一个前缀和后缀把它包起来:
<?xml version "1.0" encoding="utf-8">
<Site>
<Project>...</Project>
</Site>
但是,如果<项目>没有的根节点输入,我希望输入保持不变。
在此先感谢!
如何在父节点中包含XSLT包装输入XML,仅当它尚不存在?追加页眉和页脚,如果它们不存在与XSLT
例如,如果我输入的是:
<Project>...</Project>
我想用一个前缀和后缀把它包起来:
<?xml version "1.0" encoding="utf-8">
<Site>
<Project>...</Project>
</Site>
但是,如果<项目>没有的根节点输入,我希望输入保持不变。
在此先感谢!
这个样式表:
<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>
注意:身份转变。模式匹配
完美解决我的特定问题,谢谢。 – Mykro 2010-07-30 02:05:27
@DJC:你好!随时询问。 – 2010-07-30 12:29:13
如果只需要添加前缀和后缀是你的需求,那么你可以寻找其他的Unix选项,比如grep,这可以做得更简单。 如果你想这样做的XSL那么你shuld使用xsl:当
<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>
感谢您的回答。我很难让它工作,我很抱歉。 – Mykro 2010-07-30 02:18:40
这种转变:
<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>
从问题:“
对我的工具箱有用的答案,特别是不匹配,谢谢! – Mykro 2010-07-30 02:04:53
问得好(+1)。查看我的答案以获得完整而简单的解决方案。 – 2010-07-29 12:59:03
对于此特定问题,XSLT可能不是最佳解决方案; XSLT实质上基于现有文档和样式表生成一个全新的XML文档,但在这种情况下,最好简单地操作现有文档;我知道在C#中,从当前子节点中删除节点相当容易,将''标签放在它的位置,并将它重新添加为新元素的子节点。 –
Flynn1179
2010-07-29 14:24:33
我了解有关它的评论通过其他方式更容易。该应用程序已经部署了各种变换以升级旧的或狡猾的输入。 – Mykro 2010-07-30 02:17:37