java - 需要有关将元素属性转换为元素的 xslt 逻辑的帮助

标签 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>

最佳答案

从身份转变开始......

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

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

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

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

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

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

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

试试这个 XSLT:

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

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

    <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>

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

关于java - 需要有关将元素属性转换为元素的 xslt 逻辑的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33556040/

相关文章:

java - 是什么导致 weblogic 中的 java.net.MalformedURLException : no protocol: when trying to deploy . ear?

java - 为什么 Play 会为带有 Selendroid 的 Netty 的 HttpRequest.headers() 抛出 NoSuchMethodError?

java - 如何在Java Web Services中实现单向操作?

java - 如何让数组中的所有卡片都显示出来?

python - 在 Python 中,解析自定义 XML 标签而不解析 HTML

xslt - 为什么我不能在 XSL 中获取与应用模板一起使用的参数?

java - JAXB 和 XSLT 性能

Android NumberPicker 最大 : Set min,,默认来自 XML

php - 使用 PHP 生成正确的 XML 文件时出现的问题

html - 基于 xslt 的网站占用 100 个 cpu