2013-01-15 68 views
1

卸下根元素我有一个具有像使用XSLT

<Level> 
<Level1>...data...</Level1> 
<Level2>...data...</Level2> 
. 
. 
. 
</Level> 

我想删除<Level>标签的结构的XML模式。在xslt的帮助下,我该如何做到这一点。

+0

然后你会留下两根级元素;那是你要的吗? –

+0

我想要的结构像 ...数据... ...数据... user1980193

+0

您确定要这样吗?在无效的XML中有多个根元素。 – freefaller

回答

2

标准答案的任何“我怎么养我的大多数XML的相同,但调整它的一些小位”的问题是“使用的身份模板,然后覆盖它要改变具体的事情”

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <!-- omit the <?xml?> line in the output, it won't be well-formed anyway --> 
    <xsl:output method="xml" omit-xml-declaration="yes" /> 

    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
    <xsl:apply-templates select="node()" /> 
    </xsl:template> 
</xsl:stylesheet> 

但是正如Lister先生在评论中指出的那样,这会给你带来一些XML格式不正确的东西,因为它会有多个文档元素。

当我申请输入XML样式表

<Level> 
<Level1>...data...</Level1> 
<Level2>...data...</Level2> 
</Level> 

它产生的结果

<Level1>...data...</Level1> 
<Level2>...data...</Level2> 
+0

另外,所有的Level项目,也就是Level 1,2等...都需要分配给一个不是无限的变量......这也可以完成通过xslt? – user1980193

+0

@ user1980193请澄清你的意思是“分配给一个没有界限的变量”。 XSLT通常会生成XML。它不会将任何内容分配给XSLT之外的变量。 – JLRishe

+0

我正在尝试一个转换,其中目标将是字符串变量,它将包含所有Level1,2等元素 – user1980193

0

如果你想文档元素的所有子元素存储在一个变量,你可以做类似于:

<xsl:variable name="myVar" select="/*/*"/> 

但是,如果您希望样式表生成字符串,可能是一个解决办法:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="text"/> 

    <xsl:template match="/*"> 
    <xsl:apply-templates select="node()"/> 
    </xsl:template> 

    <xsl:template match="*"> 
    <!-- We write the opening tag --> 
    <xsl:value-of select="concat('&lt;',local-name())"/> 
    <!-- Now, all attributes --> 
    <xsl:apply-templates select="@*"/> 
    <!-- Depending on whether we have an empty element or not, 
     we're adding the content or closing it immediately --> 
    <xsl:choose> 
     <xsl:when test="node()"> 
     <!-- Close opening tag --> 
     <xsl:value-of select="'&gt;'"/> 
     <!-- Add the content --> 
     <xsl:apply-templates select="node()"/> 
     <!-- Write closing tag --> 
     <xsl:value-of select="concat('&lt;/',local-name(),'&gt;')"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <!-- Create empty element by closing tag immediately --> 
     <xsl:value-of select="'/&gt;'"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

    <xsl:template match="@*"> 
    <!-- Write an attribute --> 
    <xsl:value-of select="concat(' ',local-name(),'=&quot;',.,'&quot;')"/> 
    </xsl:template> 
</xsl:stylesheet> 

它产生的文本(因此你不会得到非格式良好的XML)。它有点过于简化,因为它不处理属性中的命名空间,注释,处理指令和引号。如果你的输入XML包含任何这些,你必须改进样式表。

0

我创建了一个新的XSLT定义,满足你的代码的帮助下,我requremtn

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output encoding="utf-8" method="text" omit-xml-declaration="yes"/> 
<xsl:variable name="nl"> 
    <xsl:text/> 
</xsl:variable> 
<xsl:variable name="tb"> 
    <xsl:text/> 
</xsl:variable> 
<xsl:template match="/*"> 
    <!-- Open the root array --> 
    <xsl:text>[{</xsl:text> 
    <xsl:value-of select="$nl"/> 
    <!-- Process all the child nodes of the root --> 
    <xsl:apply-templates mode="detect" select="*"> 
     <xsl:with-param name="indent" select="$tb"/> 
    </xsl:apply-templates> 
    <!-- Close the root array --> 
    <xsl:value-of select="$nl"/> 
    <xsl:text>}]</xsl:text> 
</xsl:template> 
<xsl:template match="*" mode="detect"> 
    <xsl:choose> 
     <xsl:when test="name(preceding-sibling::*[1]) = name(current()) and name(following-sibling::*[1]) != name(current())"> 
      <xsl:apply-templates mode="obj-content" select="."/> 
      <xsl:text>]</xsl:text> 
      <xsl:if test="count(following-sibling::*[name() != name(current())]) > 0">, </xsl:if> 
     </xsl:when> 
     <xsl:when test="name(preceding-sibling::*[1]) = name(current())"> 
      <xsl:apply-templates mode="obj-content" select="."/> 
      <xsl:if test="name(following-sibling::*) = name(current())">, </xsl:if> 
     </xsl:when> 
     <xsl:when test="following-sibling::*[1][name() = name(current())]"> 
      <xsl:text>"</xsl:text> 
      <xsl:value-of select="name()"/> 
      <xsl:text>" : [</xsl:text> 
      <xsl:apply-templates mode="obj-content" select="."/> 
      <xsl:text>, </xsl:text> 
     </xsl:when> 
     <xsl:when test="count(./child::*) > 0 or count(@*) > 0"> 
      <xsl:text>"</xsl:text> 
      <xsl:value-of select="name()"/>" : [<xsl:apply-templates 
       mode="obj-content" select="."/> 
      <xsl:if test="count(following-sibling::*) > 0">], </xsl:if> 
     </xsl:when> 
     <xsl:when test="count(./child::*) = 0"> 
      <xsl:text>"</xsl:text> 
      <xsl:value-of select="name()"/>" : "<xsl:apply-templates select="."/> 
      <xsl:text>"</xsl:text> 
      <xsl:if test="count(following-sibling::*) > 0">, </xsl:if> 
     </xsl:when> 
    </xsl:choose> 
</xsl:template> 
<xsl:template match="*" mode="obj-content"> 
    <xsl:text>{</xsl:text> 
    <xsl:apply-templates mode="attr" select="@*"/> 
    <xsl:if test="count(@*) > 0 and (count(child::*) > 0 or text())">, </xsl:if> 
    <xsl:apply-templates mode="detect" select="./*"/> 
    <xsl:if test="count(child::*) = 0 and text() and not(@*)"> 
     <xsl:text>"</xsl:text> 
     <xsl:value-of select="name()"/>" : "<xsl:value-of select="text()"/> 
     <xsl:text>"</xsl:text> 
    </xsl:if> 
    <xsl:if test="count(child::*) = 0 and text() and @*"> 
     <xsl:text>: "</xsl:text> 
     <xsl:value-of select="text()"/> 
     <xsl:text>"</xsl:text> 
    </xsl:if> 
    <xsl:text>}</xsl:text> 
    <xsl:if test="position() &lt; last()">, </xsl:if> 
</xsl:template> 
<xsl:template match="@*" mode="attr"> 
    <xsl:text>"</xsl:text> 
    <xsl:value-of select="name()"/>" : "<xsl:value-of select="."/> 
    <xsl:text>"</xsl:text> 
    <xsl:if test="position() &lt; last()">,</xsl:if> 
</xsl:template> 
<xsl:template match="node/@TEXT | text()" name="removeBreaks"> 
    <xsl:param name="pText" select="normalize-space(.)"/> 
    <xsl:choose> 
     <xsl:when test="not(contains($pText, '&#xa;'))"> 
      <xsl:copy-of select="$pText"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="concat(substring-before($pText, '&#xd;&#xa;'), ' ')"/> 
      <xsl:call-template name="removeBreaks"> 
       <xsl:with-param name="pText" select="substring-after($pText, '&#xd;&#xa;')"/> 
      </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template>