当试图删除元素标记中的命名空间时,我遇到了问题。它总是在元素标签中显示,但其他标签不显示我也使用排除-结果前缀,但它不是工作。我不知道这就是为什么请支持检查这个问题并解释它是如何工作的谢谢
XML样本
<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样本
<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>预期结果
<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>发布于 2022-07-06 08:04:30
该属性-结果前缀只影响由文字结果元素生成的名称空间,而且样式表中没有文字结果元素。
xsl:copy-of指令将元素节点从输入复制到输出。“不变”意味着元素的完全限定名(本地名称加命名空间)与输入保持不变。要更改元素的名称,需要使用apply-模板递归地处理输入,以便在遇到每个元素时更改它。
发布于 2022-07-06 04:26:27
我相信您忽略了这样一个事实:默认名称空间声明适用于其作用域中的所有元素--在您的示例中,适用于整个XML文档中的所有元素。
这意味着您不能复制任何元素;相反,您必须在无命名空间中将每个元素重新创建为一个新元素(这相当于重命名所有元素)。
尝试:
XSLT1.0
<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>https://stackoverflow.com/questions/72877865
复制相似问题