2010-07-29 41 views
3

如何在父节点中包含XSLT包装输入XML,仅当它尚不存在?追加页眉和页脚,如果它们不存在与XSLT

例如,如果我输入的是:

<Project>...</Project> 

我想用一个前缀和后缀把它包起来:

<?xml version "1.0" encoding="utf-8"> 
<Site> 
    <Project>...</Project> 
</Site> 

但是,如果<项目>没有的根节点输入,我希望输入保持不变。

在此先感谢!

+0

问得好(+1)。查看我的答案以获得完整而简单的解决方案。 – 2010-07-29 12:59:03

+0

对于此特定问题,XSLT可能不是最佳解决方案; XSLT实质上基于现有文档和样式表生成一个全新的XML文档,但在这种情况下,最好简单地操作现有文档;我知道在C#中,从当前子节点中删除节点相当容易,将''标签放在它的位置,并将它重新添加为新元素的子节点。 – Flynn1179 2010-07-29 14:24:33

+0

我了解有关它的评论通过其他方式更容易。该应用程序已经部署了各种变换以升级旧的或狡猾的输入。 – Mykro 2010-07-30 02:17:37

回答

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> 

注意:身份转变。模式匹配

+0

完美解决我的特定问题,谢谢。 – Mykro 2010-07-30 02:05:27

+0

@DJC:你好!随时询问。 – 2010-07-30 12:29:13

0

如果只需要添加前缀和后缀是你的需求,那么你可以寻找其他的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>&#xa;</xsl:text> 
         <xsl:text><Site></xsl:text> 
      </xsl:when>  </xsl:choose> <xsl:apply-templates select="Notification"/> </xsl:template> 
+0

感谢您的回答。我很难让它工作,我很抱歉。 – Mykro 2010-07-30 02:18:40

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> 
+0

从问题:“不是输入的根节点,我希望输入保持不变” – 2010-07-29 13:08:00

+0

对我的工具箱有用的答案,特别是不匹配,谢谢! – Mykro 2010-07-30 02:04:53