需要有关xslt logic的帮助,以便将元素属性转换为元素

时间:2015-11-05 22:31:09

标签: java xml xslt

我的要求如下

如果任何复杂元素仅包含文本,则相应的元素属性将转换为元素到父级别。

如果任何复杂元素包含子元素,则相应的元素属性将元素转换为相同的元素级别。

这个翻译想要实现使用xslt逻辑。

输入XML

<root>
    <food name="desert">butter scotch</food>
    <special type="nonveg">
        <name>chicken</name>
    </special>
</root>

输出XML

<root>
<food>butter scotch</food>
<name>desert</name>
<special>
    <type>nonveg</type>
    <name>chicken</name>
</special>
</root>

1 个答案:

答案 0 :(得分:1)

从Identity Transform ....开始。

$ gem install pg

对于规则“如果任何复杂元素只包含文本然后相应的元素属性转换为元素到父级”,您可以使用以下模板(我在这里忽略注释和处理 - 建立,并且只检查元素没有子元素)

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

模式为“toelement”的模板会将属性转换为元素。 (它将被其他规则重用)。

<xsl:template match="*[not(*)][@*]">
    <xsl:copy>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
    <xsl:apply-templates select="@*" mode="toelement"/>
</xsl:template>

对于规则“如果任何复杂元素包含子元素,则相应的元素属性将元素转换为相同的元素级别。”然后您实际上可以直接匹配该属性:

    <xsl:template match="@*" mode="toelement">
        <xsl:element name="{local-name()}">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>

试试这个XSLT:

<xsl:template match="*[*]/@*">
    <xsl:apply-templates select="." mode="toelement"/>
</xsl:template>