3

仅当父节点不存在时,如何让 XSLT 将输入 XML 包装在父节点中?

例如,如果我的输入是:

<Project>...</Project>

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

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

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

提前致谢!

4

3 回答 3

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>

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

于 2010-07-29T12:41:45.123 回答
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>
于 2010-07-29T12:58:15.197 回答
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>
于 2010-07-29T06:48:57.037 回答