2010-09-19 76 views
0

我可以使用XSL或类似的另一件事来改变这种格式变化xml格式的XSL或其他

<rr n="Address"> 
    <tt> 
    <j n="currentAddress">0</j> 
    <j n="city">city</j> 
    </tt> 
    </rr> 

这样: -

<Address> 
    <tt> 
    <currentAddress>0</currentAddress> 
    <city>city</city> 
    </tt> 
    <Address> 

通知我想要的属性值成为元素并删除属性 如果可能请张贴方法。

谢谢

+3

是的。是的你可以。 – amphetamachine 2010-09-19 10:20:14

+0

可以请你发帖的方法 – new 2010-09-19 10:21:40

回答

1

该样式也将工作:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes" /> 

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

<!--specialized template for elements with an "n" attribute--> 
<xsl:template match="*[@n]"> 
    <xsl:element name="{@n}"> 
     <xsl:apply-templates select="node()"/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

identity template第一模板,该模板上匹配@*(这意味着任何属性)和node()(这意味着任何元素,文本节点,处理指令或注释)。默认行为是复制匹配的项目,然后apply-templates到它的任何属性或子节点。

如果在样式表中没有声明其他模板,那么该标识模板将匹配所有内容,并且XSLT将简单地复制XML文档。

第二个模板匹配*[@n],它是任何具有“n”属性的元素。 *是任何元素的通配符匹配。方括号是谓词过滤器,其行为类似于SQL WHERE子句。谓词中指定的任何条件都必须为真,以便模板匹配选择适合的任何条件。谓词过滤器根据匹配项目的上下文进行评估,因此假设您“站立”在一个元素上,它是否具有@n?如果是这样,那么这个模板匹配。

第二个模板比第一个“标识”模板具有更具体的匹配标准,所以它会“胜出”并匹配具有@n的元素。

用于第二模板的逻辑是创建具有@n的值的名称和元素那么对于任意子node()apply-templates(它包括text()和元素,但不包括属性)。

+0

非常感谢你的工作完美可以请你解释一下我想了解答案 – new 2010-09-19 13:17:14

+0

我已经更新了答案和简短的解释。 – 2010-09-19 13:53:29

+0

+1有一个很好的解决方案和解释。 – 2010-09-19 14:51:37

0

是的XSL可以使用:)。

这里是XSL:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes" /> 


    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:choose> 
      <xsl:when test="@n"> 
       <xsl:variable name="eleName"> 
        <xsl:value-of select="@n" /> 
       </xsl:variable> 
       <xsl:element name="{$eleName}"> 
        <xsl:value-of select="text()" /> 
        <xsl:apply-templates select="*" /> 
       </xsl:element> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:copy> 
        <xsl:apply-templates select="*" /> 
       </xsl:copy> 
      </xsl:otherwise> 
     </xsl:choose> 

    </xsl:template> 

</xsl:stylesheet>