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>
注:
- 我建议您选择多个
而不是单个
,因为您的代码嵌套的深度较低 - 声明要在
级别使用的所有名称空间 - 您可以自由选择名称空间前缀-我为
namespace,您可以选择更喜欢的内容http://ECG.NOMSInhouse/V1.1.0.0
- 使用
可防止输出中显示不必要的命名空间声明exclude result prefixes
?如果我这样做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的深入理解(这可能是因为刮削和自动化也出现了爆炸)