将xml值转换为属性

时间:2015-12-06 10:42:46

标签: xml xslt

无论如何转换xml以使每个元素中的值成为该元素的属性,例如

<example>
  <abc>12</abc>
  <def>hello</def>
</example>

变为:

<example>
  <abc val=12/>
  <def val=hello/>
</example>

但其他一切都保持不变

抱歉忘了说,无论你给出什么xml,我都会非常喜欢一个实现这个目标的脚本。

2 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

    <?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" />

    <xsl:template match="example">
     <xsl:element name="{name()}">
         <xsl:apply-templates/>
     </xsl:element>
    </xsl:template>

    <xsl:template match="example/*">

    <xsl:element name="{name()}">
             <xsl:attribute name="val"><xsl:value-of select="."/></xsl:attribute>
      </xsl:element>
    </xsl:template>

</xsl:transform>

但是,根据您的实际输入结构,您可能需要更改模板选择器。

答案 1 :(得分:0)

写一个模板

<xsl:template match="example/*[not(*)]">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
    <xsl:attribute name="val" select="."/>
  </xsl:element>
</xsl:template>

加上当然的身份转换模板

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

如果要将所有没有子元素的元素转换为<foo val="..."/>格式,请将模板匹配模式从<xsl:template match="example/*[not(*)]">更改为<xsl:template match="*[not(*)]">。另请注意,我使用了XSLT 2.0语法<xsl:attribute name="val" select="."/>,使用了需要<xsl:attribute name="val"><xsl:value-of select="."/></xsl:attribute>的XSLT 1.0处理器。

对于任何类型的XML文档都有一个工作方法,如果你有<foo><bar><baz>foobar</baz></bar><bar>value</bar></foo>,那么简单的方法会抛出一个错误,因为在创建子元素之后会发生属性创建。目前尚不清楚您想要哪个结果顺序,因此您需要编辑您的问题并向我们展示可能的输入和想要的结果样本的更多详细信息。