XSLT 1.0 - 向节点更改/添加命名空间

XSLT 1.0 - Change/add namespace to nodes

提问人:IntegrationExpert 提问时间:11/18/2022 最后编辑:branceIntegrationExpert 更新时间:11/18/2022 访问量:264

问:

我目前正在尝试在 SAP PI 中创建 XSLT 1.0 映射以更改/添加特定节点的命名空间。给定输入 .xml,我必须创建一个 XSL 文件来获取输出 .xml,如下所示。不幸的是,到目前为止,我所有的尝试都没有成功。如果有人能提供 XSL 表来解决这个问题,我会很高兴。如果有人能帮助我,我会很高兴,因为我已经非常接近绝望了。

输入.XML

<?xml version="1.0" encoding="UTF-8"?>
<ns0:serviceABC xmlns:ns0="http://namespaceToReplace">
    <XYZ>
        <Zugang>
            <MandantCode>test</MandantCode>
            <BenutzerId>test</BenutzerId>
            <Password>test</Password>
        </Zugang>
        <Personen>
            <GpCode>0000000001</GpCode>
            <Name>Name1</Name>
            <LandCode>DE</LandCode>
        </Personen>
        <Personen>
            <GpCode>0000000002</GpCode>
            <Name>Name2</Name>
            <LandCode>DE</LandCode>
        </Personen>
        <Personen>
            <GpCode>0000000003</GpCode>
            <Name>Name3</Name>
            <LandCode>DE</LandCode>
        </Personen>
        <Personen>
            <GpCode>0000000004</GpCode>
            <Name>Name4</Name>
            <LandCode>DE</LandCode>
        </Personen>
    </XYZ>
</ns0:serviceABC>

输出.XML (“ns0:” - 需要删除前缀,必须在节点服务 ABC 中替换 “xmlns=”http://newNamespace1“”,必须将“xmlns=”http://newNamespace2“” 添加到节点 XYZ):

<?xml version="1.0" encoding="UTF-8"?>
<serviceABC xmlns="http://newNamespace1">
    <XYZ xmlns="http://newNamespace2">
        <Zugang>
            <MandantCode>test</MandantCode>
            <BenutzerId>test</BenutzerId>
            <Password>test</Password>
        </Zugang>
        <Personen>
            <GpCode>0000000001</GpCode>
            <Name>Name1</Name>
            <LandCode>DE</LandCode>
        </Personen>
        <Personen>
            <GpCode>0000000002</GpCode>
            <Name>Name2</Name>
            <LandCode>DE</LandCode>
        </Personen>
        <Personen>
            <GpCode>0000000003</GpCode>
            <Name>Name3</Name>
            <LandCode>DE</LandCode>
        </Personen>
        <Personen>
            <GpCode>0000000004</GpCode>
            <Name>Name4</Name>
            <LandCode>DE</LandCode>
        </Personen>
    </XYZ>
</serviceABC>

我期待着你们的来信。

开发的源代码根本不起作用

XSLT 命名空间 映射 XSLT-1.0

评论

0赞 michael.hor257k 11/18/2022
命名空间经常被误解。这就是为什么我回答了你的问题——即使它应该被关闭。

答:

0赞 michael.hor257k 11/18/2022 #1

“xmlns=”http://newNamespace2“” 必须添加到节点 XYZ):

我不认为你了解你的任务的性质。这不是向单个节点添加命名空间声明的问题。

在输出中,元素及其所有后代都已移动到新命名空间中。这意味着它们都必须重命名(根元素也是如此):XYZns0:serviceABC

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://namespaceToReplace"
exclude-result-prefixes="ns0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/ns0:serviceABC">
    <serviceABC xmlns="http://newNamespace1">
        <xsl:apply-templates/>
    </serviceABC>
</xsl:template>

<xsl:template match="*">
    <xsl:element name="{local-name()}" namespace="http://newNamespace2">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>