Xml 名称空间问题

Xml 名称空间问题,xml,xslt,Xml,Xslt,我需要输入xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“输入我需要发送给第三方的邮件标题。 或者有没有一种方法可以删除xsi:release属性,但同时保留xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance 这是我的xslt: <xsl:choose> <xsl:when test="$msgtype='Nomination_Document'">

我需要输入
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“
输入我需要发送给第三方的邮件标题。
或者有没有一种方法可以删除
xsi:release
属性,但同时保留
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance

这是我的xslt:

<xsl:choose>
    <xsl:when test="$msgtype='Nomination_Document'">
        <xsl:element name="Nomination_Document" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" namespace="{$msgns}">
            <xsl:attribute name="xsi:release" xmlns="http://www.w3.org/2001/XMLSchema-instance">
            </xsl:attribute> 
            <xsl:attribute name="release" xmlns="http://www.w3.org/2001/XMLSchema-instance">
                <xsl:value-of select="'3'"/>
            </xsl:attribute> 

这是我的意见:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TSMessage xmlns="http://ECG.NOMSInhouse/V1.1.0.0">
    <Header>
        <MsgNumber Revision="1" MsgNo="840711"/>
        <GenerationDate Date="2019-04-16T11:55:22+02:00"/>
        <MsgSender Role="ZSH" Label="" CodeAgency="" ID=""/>
        <MsgReceiver Role="ZSO" Label="" CodeAgency="" ID=""/>
        <MsgType TypeCode="TN"/>
        <Subject Text=""/>
        <MsgPeriod TimeTo="2019-04-18T06:00:00+02:00" TimeFrom="2019-04-17T06:00:00+02:00"/>
        <Contract ContractID=""/>

这就是我现在得到的:

<?xml version="1.0" encoding="UTF-8"?><Nomination_Document 
 xmlns="urn:easeegas.eu:edigas:nominationandmatching:nominationdocument:5:1" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:release="" 
 release="3">

我需要邮件的标题如下所示:

<?xml version="1.0" encoding="UTF-8"?><Nomination_Document 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="urn:easeegas.eu:edigas:nominationandmatching:nominationdocument:5:1 " release="3">

您可以删除
xsi:release
并添加此行

例如:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">

<xsl:output method="xml" indent="yes"/>

<xsl:variable name="msgtype" select="'Nomination_Document'" />
<xsl:variable name="msgns" select="'urn:easeegas.eu:edigas:nominationandmatching:nominationdocument:5:1'" />

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="$msgtype='Nomination_Document'">
            <xsl:element name="Nomination_Document" namespace="{$msgns}">
                <xsl:namespace name="xsi" select="'http://www.w3.org/2001/XMLSchema-instance'"/>
                <xsl:attribute name="release">
                    <xsl:value-of select="'3'" />
                </xsl:attribute>
            </xsl:element>
        </xsl:when>
    </xsl:choose>
</xsl:template>

除非元素/属性名称是动态计算的,否则不要使用
。如果它们是固定的(如本例中),只需直接写下元素/属性即可

此样式表:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ecg="http://ECG.NOMSInhouse/V1.1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="urn:easeegas.eu:edigas:nominationandmatching:nominationdocument:5:1"
    exclude-result-prefixes="ecg xsi"
>
    <xsl:output indent="yes" encoding="utf-8" />

    <xsl:template match="ecg:TSMessage[ecg:Header/ecg:MsgType/@TypeCode = 'TN']">
        <Nomination_Document release="3">
            <xsl:comment> ... more processing ... </xsl:comment>
        </Nomination_Document>
    </xsl:template>
</xsl:stylesheet>

…更多处理。。。
应用于此XML:

<TSMessage xmlns="http://ECG.NOMSInhouse/V1.1.0.0">
    <Header>
        <MsgNumber Revision="1" MsgNo="840711"/>
        <GenerationDate Date="2019-04-16T11:55:22+02:00"/>
        <MsgSender Role="ZSH" Label="" CodeAgency="" ID=""/>
        <MsgReceiver Role="ZSO" Label="" CodeAgency="" ID=""/>
        <MsgType TypeCode="TN"/>
        <Subject Text=""/>
        <MsgPeriod TimeTo="2019-04-18T06:00:00+02:00" TimeFrom="2019-04-17T06:00:00+02:00"/>
        <Contract ContractID=""/>
    </Header>
</TSMessage>

产生以下结果:

<?xml version="1.0" encoding="utf-8"?>
<Nomination_Document release="3" xmlns="urn:easeegas.eu:edigas:nominationandmatching:nominationdocument:5:1">
    <!-- ... more processing ... -->
</Nomination_Document>

注:

  • 我建议您选择多个
    而不是单个
    ,因为您的代码嵌套的深度较低
  • 声明要在
    级别使用的所有名称空间
  • 您可以自由选择名称空间前缀-我为
    http://ECG.NOMSInhouse/V1.1.0.0
    namespace,您可以选择更喜欢的内容
  • 使用
    exclude result prefixes
    可防止输出中显示不必要的命名空间声明

嗯…从XSLT中删除
?如果我这样做xmlns:xsi=”“不在消息中,因此不直接相关:但是XSI名称空间由W3C拥有,并且它不包括名为
XSI:release
的属性。”。将自己的名字添加到其他人的名称空间总是不礼貌的,并且会产生潜在的冲突;但是对于XSI名称空间,这是自找麻烦的,因为这是一个“神奇”的名称空间,它的规则和意义内置于许多XML工具中。谢谢,但是当我用名称空间名称替换XSI:release时,它说它不能是元素的子节点,我需要它位于提名文档元素节点中。您替换了整行了吗?不要只更换
xsi:release
。它被用作
xsl:attribute
。我使用的是
xsl:namespace
。您能完成xslt编码以使消息看起来像我要的吗?我喜欢关于正确使用文本结果元素而不是
xsl:element
指令的建议,以及模板规则优先于条件指令的建议。但我认为根本的问题是作用域内命名空间声明的已模糊。在
xsl:stylesheet
或literal-result元素
namignment\u文档中声明名称空间具有相同的效果:如果您从
排除结果前缀属性的列表中删除
xsi
标记,则您将获得准确的exped输出。@Alejandro欢迎回来!我以为你在10年前就放弃了这个网站我同意,声明名称空间的位置无关紧要——我只是更喜欢在顶层执行,这样所有名称空间都可以在一个位置进行管理。@Tomalak谢谢!这几个月我有一些空闲时间,所以我回来了。我已经注意到XSLT2.0的问题已经大量出现,XSLT3.0的情况并非如此(我认为可能是因为许多最好的特性都是封闭源代码的)。但是,对XSLT1.0/XPath1.0问题的回答似乎缺乏对该语言甚至XML的深入理解(这可能是因为刮削和自动化也出现了爆炸)