首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在xslt逻辑方面需要帮助将元素属性转换为元素

在xslt逻辑方面需要帮助将元素属性转换为元素
EN

Stack Overflow用户
提问于 2015-11-05 22:31:09
回答 1查看 81关注 0票数 0

我的要求如下

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

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

此转换希望使用xslt逻辑来实现。

输入XML

代码语言:javascript
复制
<root>
    <food name="desert">butter scotch</food>
    <special type="nonveg">
        <name>chicken</name>
    </special>
</root>

输出XML

代码语言:javascript
复制
<root>
<food>butter scotch</food>
<name>desert</name>
<special>
    <type>nonveg</type>
    <name>chicken</name>
</special>
</root>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-05 22:53:47

从身份转换开始..。

代码语言:javascript
复制
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

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

代码语言:javascript
复制
<xsl:template match="*[not(*)][@*]">
    <xsl:copy>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
    <xsl:apply-templates select="@*" mode="toelement"/>
</xsl:template>

带有模式"toelement“的模板将将属性转换为一个元素。(另一条规则将重复使用)。

代码语言:javascript
复制
    <xsl:template match="@*" mode="toelement">
        <xsl:element name="{local-name()}">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>

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

代码语言:javascript
复制
<xsl:template match="*[*]/@*">
    <xsl:apply-templates select="." mode="toelement"/>
</xsl:template>

试试这个XSLT:

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33556040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档