从 xml 的元素中提取命名空间属性

Posted

技术标签:

【中文标题】从 xml 的元素中提取命名空间属性【英文标题】:Extract namespace attribute from elements of xml 【发布时间】:2021-02-12 16:07:07 【问题描述】:

有 XML 文件(如下所示)。我想知道如何使用 MSXML6.0 解析器从 AppHdr 和 Document 元素中提取名称空间(xmlns 属性)。 我可以将 AppHdr 的命名空间属性的路径表示为“Messages/:AppHdr/namespace::”,但它适用于 xPath 2.0 及更高版本。 如果我尝试使用这样的路径 (Messages/:AppHdr/namespace::) 将 xsl 发送到 msxml6.0,它会返回错误。

    <?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" encoding="utf-8">
    <xsl:template match="Messages/*:AppHdr/namespace::*">
        <xsl:copy>
            <xsl:value-of select="."/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

msxsl.exe error

任何人都可以建议 xpath-expression 的正确视图吗?

XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<Messages>
    <AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01">
        <Fr>
            <OrgId>
                <Nm>Open Brok Ltd.</Nm>
                <Id>
                    <OrgId>
                        <Othr>
                            <Id>1083732703772</Id>
                            <Is-s-r>OGRN</Is-s-r>
                        </Othr>
                    </OrgId>
                </Id>
            </OrgId>
        </Fr>
        <BizMsgIdr>12345</BizMsgIdr>
        <MsgDefIdr>semt.017.001.09</MsgDefIdr>
        <CreDt>2020-01-24T14:32:23Z</CreDt>
    </AppHdr>
    <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:semt.017.001.09">
        <SctiesTxPstngRpt>
            <Pgntn>
                <PgNb>1</PgNb>
                <LastPgInd>true</LastPgInd>
            </Pgntn>
            <StmtGnlDtls>
                <RptNb>
                <Shrt>000</Shrt>
              </RptNb>
              <StmtPrd>
                  <FrDtToDt>
                  <FrDt>2017-04-04</FrDt>
                  <ToDt>2017-04-04</ToDt>
                  </FrDtToDt>
              </StmtPrd>
              <Frqcy>
                  <Cd>DAIL</Cd>
              </Frqcy>
              <UpdTp>
                  <Cd>COMP</Cd>
              </UpdTp>
              <StmtBsis>
                  <Cd>SETT</Cd>
              </StmtBsis>
              <ActvtyInd>true</ActvtyInd>
              <SubAcctInd>true</SubAcctInd>
            </StmtGnlDtls>
            <AcctOwnr>
                <Id>
                    <PrtryId>
                        <Id>1067534439317</Id>
                        <Is-s-r>OGRN</Is-s-r>
                    </PrtryId>
                </Id>
            </AcctOwnr>
            <SfkpgAcct>
                <Id>R50938400000</Id>
                <Nm>NSD</Nm>
            </SfkpgAcct>
            <SubAcctDtls>
                <SfkpgAcct>
                    <Id>R50526502570</Id>
                    <Nm>DVP Euroclear/NSD</Nm>
                </SfkpgAcct>
                <ActvtyInd>true</ActvtyInd>
                <FinInstrmDtls>
                    <FinInstrmId>
                        <ISIN>US92719A1060</ISIN>
                        <Desc>VIMPELCOM-2-ADR</Desc>
                    </FinInstrmId>
                    <Tx>
                        <AcctOwnrTxId>OP201704040000491</AcctOwnrTxId>
                        <CorpActnEvtId>AdmPor - VIMPELCOM-2</CorpActnEvtId>
                        <TxDtls>
                            <TxActvty>
                                <Cd>CORP</Cd>
                            </TxActvty>
                            <SctiesMvmntTp>DELI</SctiesMvmntTp>
                            <Pmt>FREE</Pmt>
                            <PstngQty>
                                <Qty>
                                    <Unit>540000</Unit>
                                </Qty>
                            </PstngQty>
                            <FctvSttlmDt>
                                <Dt>2017-04-04</Dt>
                            </FctvSttlmDt>
                            <TxAddtlDtls>AdmPor - VIMPELCOM-2 от 04.04.2017</TxAddtlDtls>
                        </TxDtls>
                    </Tx>
                </FinInstrmDtls>
            </SubAcctDtls>
        </SctiesTxPstngRpt>
    </Document>
</Messages>

【问题讨论】:

【参考方案1】:

如果您想知道AppHdr 元素在哪个命名空间中,您可以使用:

<xsl:value-of select="namespace-uri(/Messages/*[local-name()='AppHdr'])"/>

注意表达式:

/Messages/*[local-name()='AppHdr']/namespace::*

将选择 AppHdr 元素范围内的 all 命名空间 - 在 XSLT 1.0 中,xsl:value-of 指令将仅返回所选节点集的第一个节点的字符串值.

【讨论】:

感谢您的正确指导。您能否提示从结果集中排除“" 元素的方法。我的 xslt 脚本: w3.org/1999/XSL/Transform"> 生成结果集: xml version="1.0" encoding="UTF-16"?>urn:iso:std:iso:20022:tech:xsd:head.001.001.01 请不要在 cmets 中发布代码。如果您不想要 XML 声明,请将 &lt;xsl:output omit-xml-declaration="yes"/&gt;&lt;xsl:output method="text" /&gt; 添加到样式表的顶层。

以上是关于从 xml 的元素中提取命名空间属性的主要内容,如果未能解决你的问题,请参考以下文章

从 xml 中提取值,它具有命名空间并解析 xml cdata

xml的命名空间

匹配具有命名空间属性的 XML 元素时遇到问题

如何从 XML 元素中删除一个特定的命名空间

Xml Jaxb 命名空间和属性顺序

xml 从元素中删除命名空间