没有 xmlns 的 XSL 复制节点 [英] XSL Copy nodes without xmlns

查看:20
本文介绍了没有 xmlns 的 XSL 复制节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个特定的问题.我必须将 XML 结构转换为其他结构,其中基本 XSD 相同,仅命名空间定义不同.第一部分很简单,因为这里我必须使用字段映射.第二部分是简单的复制.这就是问题所在.复制的主"节点包含原始 xmlns 属性.我需要删除这个属性".

I have a specific problem. I have to transform an XML structure to other, where the base XSD is same, different only the namespace definition. The first part is simple, because here I have to use field-mapping. The second part is the simple copy. And here is the problem. The copied "main" node contains the original xmlns attribute. I need to remove this "attribute".

基础xml:

<?xml version="1.0" encoding="UTF-8"?>
<S2SCTIcf:SCTIcfBlkCredTrf xmlns:S2SCTIcf="urn:S2SCTIcf:xsd:$SCTIcfBlkCredTrf"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:S2SCTIcf:xsd:$SCTIcfBlkCredTrf SCTIcfBlkCredTrf.xsd">
    <S2SCTIcf:SndgInst>XXXXXXX0</S2SCTIcf:SndgInst>
    <S2SCTIcf:RcvgInst>YYYYYYY0</S2SCTIcf:RcvgInst>
    <S2SCTIcf:FileRef>2013111200800546</S2SCTIcf:FileRef>
    <S2SCTIcf:SrvcId>SCT</S2SCTIcf:SrvcId>
    <S2SCTIcf:TstCode>T</S2SCTIcf:TstCode>
    <S2SCTIcf:FType>ICF</S2SCTIcf:FType>
    <S2SCTIcf:FDtTm>2013-11-12T16:26:31</S2SCTIcf:FDtTm>
    <S2SCTIcf:NumCTBlk>1</S2SCTIcf:NumCTBlk>
    <S2SCTIcf:NumPCRBlk>0</S2SCTIcf:NumPCRBlk>
    <S2SCTIcf:NumRFRBlk>0</S2SCTIcf:NumRFRBlk>
    <S2SCTIcf:NumROIBlk>0</S2SCTIcf:NumROIBlk>
    <S2SCTIcf:FIToFICstmrCdtTrf xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.02">
        <GrpHdr>
            <MsgId>xxddccxxaaa</MsgId>
            <CreDtTm>2013-11-12T16:26:31</CreDtTm>
            <NbOfTxs>1</NbOfTxs>
            <TtlIntrBkSttlmAmt Ccy="EUR">469.12</TtlIntrBkSttlmAmt>
            <IntrBkSttlmDt>2013-11-13</IntrBkSttlmDt>
            <SttlmInf>
                <SttlmMtd>CLRG</SttlmMtd>
                <ClrSys>
                    <Prtry>ST2</Prtry>
                </ClrSys>
            </SttlmInf>
            <InstgAgt>
                <FinInstnId>
                    <BIC>XXXXXXX0</BIC>
                </FinInstnId>
            </InstgAgt>
        </GrpHdr>
        <CdtTrfTxInf>
            <PmtId>
                <EndToEndId>1114405599,1114382976</EndToEndId>
                <TxId>F3232323232</TxId>
            </PmtId>
            <PmtTpInf>
                <SvcLvl>
                    <Cd>SEPA</Cd>
                </SvcLvl>
            </PmtTpInf>
            <IntrBkSttlmAmt Ccy="EUR">469.12</IntrBkSttlmAmt>
            <ChrgBr>SLEV</ChrgBr>
            <Dbtr>
                <Nm>ddffrrddsaasas</Nm>
                <PstlAdr>
                    <Ctry>HU</Ctry>
                    <AdrLine>dssdsdsdsdsdaas</AdrLine>
                </PstlAdr>
            </Dbtr>
            <DbtrAcct>
                <Id>
                    <IBAN>HU26XXXXXXXXXXXXXX</IBAN>
                </Id>
            </DbtrAcct>
            <DbtrAgt>
                <FinInstnId>
                    <BIC>CCCCHUH0</BIC>
                </FinInstnId>
            </DbtrAgt>
            <CdtrAgt>
                <FinInstnId>
                    <BIC>CVCVCVCVCVC</BIC>
                </FinInstnId>
            </CdtrAgt>
            <Cdtr>
                <Nm>XXXXX</Nm>
                <PstlAdr>
                    <Ctry>DE</Ctry>
                </PstlAdr>
            </Cdtr>
            <CdtrAcct>
                <Id>
                    <IBAN>DE12vvvvvvvhghhg</IBAN>
                </Id>
            </CdtrAcct>
            <RmtInf>
                <Ustrd>0000000000,0000000000 </Ustrd>
            </RmtInf>
        </CdtTrfTxInf>
    </S2SCTIcf:FIToFICstmrCdtTrf>
</S2SCTIcf:SCTIcfBlkCredTrf>

xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns0="urn:S2SCTIcf:xsd:$SCTIcfBlkCredTrf"
    xmlns:sw8="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.02"
    xmlns:S2SCTScf="urn:S2SCTScf:xsd:$SCTScfBlkCredTrf" exclude-result-prefixes="xs ns0 ">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:variable name="var1_SCTIcfBlkCredTrf" select="ns0:SCTIcfBlkCredTrf"/>
        <S2SCTScf:SCTScfBlkCredTrf
            xsi:schemaLocation="urn:S2SCTScf:xsd:$SCTScfBlkCredTrf SCTScfBlkCredTrf.xsd"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:S2SCTScf="urn:S2SCTScf:xsd:$SCTScfBlkCredTrf">
            <xsl:for-each select="$var1_SCTIcfBlkCredTrf">
                <S2SCTScf:SndgInst>
                    <xsl:value-of select="string(ns0:RcvgInst)"/>
                </S2SCTScf:SndgInst>
            </xsl:for-each>
            <xsl:for-each select="$var1_SCTIcfBlkCredTrf">
                <S2SCTScf:RcvgInst>
                    <xsl:value-of select="string(ns0:SndgInst)"/>
                </S2SCTScf:RcvgInst>
            </xsl:for-each>
            <xsl:for-each select="$var1_SCTIcfBlkCredTrf">
                <S2SCTScf:SrvcId>
                    <xsl:value-of select="string(ns0:SrvcId)"/>
                </S2SCTScf:SrvcId>
            </xsl:for-each>
            <xsl:for-each select="$var1_SCTIcfBlkCredTrf">
                <S2SCTScf:TstCode>
                    <xsl:value-of select="string(ns0:TstCode)"/>
                </S2SCTScf:TstCode>
            </xsl:for-each>
            <S2SCTScf:FType>SCF</S2SCTScf:FType>
            <xsl:for-each select="$var1_SCTIcfBlkCredTrf">
                <S2SCTScf:FileRef>
                    <xsl:value-of select="string(ns0:FileRef)"/>
                </S2SCTScf:FileRef>
            </xsl:for-each>
            <S2SCTScf:RoutingInd>DIR</S2SCTScf:RoutingInd>
            <xsl:for-each select="$var1_SCTIcfBlkCredTrf">
                <S2SCTScf:FileBusDt>
                    <xsl:value-of select="string(ns0:FDtTm)"/>
                </S2SCTScf:FileBusDt>
            </xsl:for-each>
            <S2SCTScf:FIToFICstmrCdtTrf xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.02">
                <xsl:for-each select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf">
                    <GrpHdr>
                        <xsl:for-each select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf">
                            <MsgId>
                                <xsl:value-of select="string(sw8:GrpHdr/sw8:MsgId)"/>
                            </MsgId>
                        </xsl:for-each>
                        <xsl:for-each select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf">
                            <CreDtTm>
                                <xsl:value-of select="string(sw8:GrpHdr/sw8:CreDtTm)"/>
                            </CreDtTm>
                        </xsl:for-each>
                        <xsl:for-each select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf">
                            <NbOfTxs>
                                <xsl:value-of select="string(sw8:GrpHdr/sw8:NbOfTxs)"/>
                            </NbOfTxs>
                        </xsl:for-each>
                        <xsl:for-each select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf">
                            <xsl:variable name="var2_TtlIntrBkSttlmAmt"
                                select="sw8:GrpHdr/sw8:TtlIntrBkSttlmAmt"/>
                            <TtlIntrBkSttlmAmt>
                                <xsl:attribute name="Ccy" namespace="">
                                    <xsl:value-of select="string($var2_TtlIntrBkSttlmAmt/@Ccy)"/>
                                </xsl:attribute>
                                <xsl:value-of
                                    select="string(number(string($var2_TtlIntrBkSttlmAmt)))"/>
                            </TtlIntrBkSttlmAmt>
                        </xsl:for-each>
                        <xsl:for-each select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf">
                            <IntrBkSttlmDt>
                                <xsl:value-of select="string(sw8:GrpHdr/sw8:IntrBkSttlmDt)"/>
                            </IntrBkSttlmDt>
                        </xsl:for-each>
                        <SttlmInf>
                            <xsl:for-each select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf">
                                <SttlmMtd>
                                    <xsl:value-of
                                        select="string(sw8:GrpHdr/sw8:SttlmInf/sw8:SttlmMtd)"/>
                                </SttlmMtd>
                            </xsl:for-each>
                            <ClrSys>
                                <xsl:for-each select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf">
                                    <Prtry>
                                        <xsl:value-of
                                            select="string(sw8:GrpHdr/sw8:SttlmInf/sw8:ClrSys/sw8:Prtry)"
                                        />
                                    </Prtry>
                                </xsl:for-each>
                            </ClrSys>
                        </SttlmInf>
                        <InstdAgt>
                            <FinInstnId>
                                <xsl:for-each
                                    select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf/sw8:GrpHdr/sw8:InstgAgt">
                                    <BIC>
                                        <xsl:value-of select="string(sw8:FinInstnId/sw8:BIC)"/>
                                    </BIC>
                                </xsl:for-each>
                            </FinInstnId>
                        </InstdAgt>
                    </GrpHdr>
                    <xsl:copy-of select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf/sw8:CdtTrfTxInf" />
                </xsl:for-each>
            </S2SCTScf:FIToFICstmrCdtTrf>
        </S2SCTScf:SCTScfBlkCredTrf>
    </xsl:template>
</xsl:stylesheet>

输出的错误部分:

...
     </InstdAgt>
  </GrpHdr>
  <CdtTrfTxInf xmlns:S2SCTIcf="urn:S2SCTIcf:xsd:$SCTIcfBlkCredTrf">
     <PmtId>
        <EndToEndId>1114405599,1114382976</EndToEndId>
        <TxId>F3232323232</TxId>
 ...

我不想获得 xmlns:S2SCTIcf="urn:S2SCTIcf:xsd:$SCTIcfBlkCredTrf" 属性这一行.

I don't want to get the xmlns:S2SCTIcf="urn:S2SCTIcf:xsd:$SCTIcfBlkCredTrf" attribute this line.

有人知道吗?

谢谢!

费里

推荐答案

你的问题是

<xsl:copy-of select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf/sw8:CdtTrfTxInf" />

从原始树中复制节点包括它的命名空间节点",即原始文档中那个点范围内的命名空间声明.当此节点被序列化时,序列化程序将声明输出文档中此时尚未生效的任何命名空间节点.

copies the node from the original tree including its "namespace nodes", i.e. the namespace declarations that were in scope at that point in the original document. When this node is serialized any of these namespace nodes that are not already in force at this point in the output document will be declared by the serializer.

如果您能够使用 XSLT 2.0,那么您可以尝试设置 copy-namespaces="no"copy-of 上,但这不是 XSLT 1.0 中的一个选项.因此,不是使用 copy-of,您需要使用模板来复制该节点(及其所有递归子节点) 不包括命名空间节点.我能想到的最简单的方法是声明两个额外的模板

If you were able to use XSLT 2.0 then you could try setting copy-namespaces="no" on the copy-of but that isn't an option in XSLT 1.0. So instead of using copy-of you need to use templates to copy that node (and all its descendants recursively) without including the namespace nodes. The simplest way I can think of to do this is to declare two additional templates

<xsl:template match="*" mode="copy">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
    <xsl:apply-templates select="@*|node()" mode="copy" />
  </xsl:element>
</xsl:template>

<xsl:template match="@*|text()|comment()" mode="copy">
  <xsl:copy/>
</xsl:template>

然后用

<xsl:apply-templates mode="copy"
   select="$var1_SCTIcfBlkCredTrf/ns0:FIToFICstmrCdtTrf/sw8:CdtTrfTxInf" />

这里的技巧是 xsl:element 正在创建一个 元素节点,该节点恰好与原始节点具有相同的名称和命名空间,而不是复制原始节点节点,所以它不会复制命名空间节点.

The trick here is that xsl:element is creating a new element node that happens to have the same name and namespace as the original one, rather than copying the original node, so it doesn't copy the namespace nodes.

这篇关于没有 xmlns 的 XSL 复制节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆