首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免元素中的命名空间

避免元素中的命名空间
EN

Stack Overflow用户
提问于 2022-07-06 04:10:31
回答 2查看 46关注 0票数 0

当试图删除元素标记中的命名空间时,我遇到了问题。它总是在元素标签中显示,但其他标签不显示我也使用排除-结果前缀,但它不是工作。我不知道这就是为什么请支持检查这个问题并解释它是如何工作的谢谢

XML样本

代码语言:javascript
复制
<STATUS
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="MOM.Production">
    <A>
        <A1 CODE="11111" DESC="RAW" >
            <A2>
                <A2_ITEM NUMBER="DUM20000001" REVISION="01"  />
                <A2_ITEM NUMBER="DUM20000002" REVISION="01" />
            </A2>
        </A1>
        <A1 CODE="22222" DESC="POI" >
            <A2>
                <A2_ITEM NUMBER="DUM20000003" REVISION="01"  />
                <A2_ITEM NUMBER="DUM20000004" REVISION="01" />
            </A2>
        </A1>
    </A>
    <B>
        <B1 ID="A10" >A101</B1>
        <B1 ID="A12" >A121</B1>
        <B1 ID="A13" >A132</B1>
    </B>
</STATUS>

XSLT样本

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:mom="MOM.Production" exclude-result-prefixes="mom" >
    <xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0" />
    <xsl:template match="/mom:STATUS">
        <xsl:element name="Telegram">
            <xsl:element name="Body">
                <xsl:apply-templates select="/mom:STATUS/mom:A"/>
                <xsl:apply-templates select="/mom:STATUS/mom:B"/>
            </xsl:element>
        </xsl:element>
    </xsl:template>
    <xsl:template match="/mom:STATUS/mom:A">
        <xsl:element name="A">
            <xsl:copy-of select="*" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="/mom:STATUS/mom:B">
        <xsl:element name="Options">
            <xsl:for-each select="/mom:STATUS/mom:B/mom:B1">
                <xsl:element name="Option">
                    <xsl:attribute name="code">
                        <xsl:value-of select="text()"/>
                    </xsl:attribute>
                    <xsl:attribute name="family">
                        <xsl:variable name="n">
                            <xsl:number/>
                        </xsl:variable>
                        <xsl:value-of select="$n - 1"/>
                    </xsl:attribute>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

预期结果

代码语言:javascript
复制
<Telegram>
    <Body>
        <A>
            <A1
             CODE="11111"
             DESC="RAW">
                <A2>
                    <A2_ITEM NUMBER="DUM20000001" REVISION="01"/>
                    <A2_ITEM NUMBER="DUM20000002" REVISION="01"/>
                </A2>
            </A1>
            <A1
             CODE="22222"
             DESC="POI">
                <A2>
                    <A2_ITEM NUMBER="DUM20000003" REVISION="01"/>
                    <A2_ITEM NUMBER="DUM20000004" REVISION="01"/>
                </A2>
            </A1>
        </A>
        <Options>
            <Option code="A101" family="0"/>
            <Option code="A121" family="1"/>
            <Option code="A132" family="2"/>
        </Options>
    </Body>
</Telegram>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-06 08:04:30

该属性-结果前缀只影响由文字结果元素生成的名称空间,而且样式表中没有文字结果元素。

xsl:copy-of指令将元素节点从输入复制到输出。“不变”意味着元素的完全限定名(本地名称加命名空间)与输入保持不变。要更改元素的名称,需要使用apply-模板递归地处理输入,以便在遇到每个元素时更改它。

票数 0
EN

Stack Overflow用户

发布于 2022-07-06 04:26:27

我相信您忽略了这样一个事实:默认名称空间声明适用于其作用域中的所有元素--在您的示例中,适用于整个XML文档中的所有元素。

这意味着您不能复制任何元素;相反,您必须在无命名空间中将每个元素重新创建为一个新元素(这相当于重命名所有元素)。

尝试:

XSLT1.0

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mom="MOM.Production" 
exclude-result-prefixes="mom">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/mom:STATUS">
    <Telegram>
        <Body>
            <xsl:apply-templates/>
        </Body>
    </Telegram>
</xsl:template>
    
<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

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

<xsl:template match="mom:B1">
    <Option code="{.}" family="{position() - 1}"/>
</xsl:template>

</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72877865

复制
相关文章

相似问题

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