如果XSLT不存在页眉和页脚,请附加页眉和页脚

时间:2010-07-29 06:41:35

标签: xml xslt header root

如果父节点中的XSLT包装输入XML,只有在它不存在的情况下才能使用它?

例如,如果我的输入是:

<Project>...</Project>

我想用前缀和后缀包装它:

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

但是,如果&lt; Project&gt;不是输入的根节点,我希望输入保持不变。

提前致谢!

3 个答案:

答案 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>&#xa;</xsl:text>
                        <xsl:text><Site></xsl:text>
            </xsl:when>     </xsl:choose>   <xsl:apply-templates select="Notification"/> </xsl:template>