在我的情况下,输入XML必须具有命名空间的声明,其中根元素(即 <message>
)是。
在示例1中, <message>
元素是命名空间http://www.origostandards.com/schema/mtg/v2
的一部分。它在XML中声明,并且<message>
元素在XML中存在带有前缀mtg
。't保留除根元素以外的其他元素的名称空间。如果未声明消息元素的名称空间(示例2),则styeleSheet必须在根元素中声明默认的namespace http://www.origoservices.com
产生输出。(请参阅xence2)
但是,我开发的样式表在没有分配给元素的名称空间前缀的情况下(示例2),并且对XML不起作用,并且对XML不起作用的命名空间元素名称均为名称空间(emame11)。
示例1 输入XML
<?xml version="1.0"?>
<mtg:message xmlns:ce="http://www.origostandards.com/schema/ce/v2" xmlns:mtg="http://www.origostandards.com/schema/mtg/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<mtg:m_control id="m_control1">
<mtg:control_timestamp>2014-12-18T10:06:00-05:00</mtg:control_timestamp>
<mtg:message_id>c5-a4e0-aa0090358c7f</mtg:message_id>
<mtg:retry_number>0</mtg:retry_number>
<mtg:expected_response_type>synchronous</mtg:expected_response_type>
<mtg:initiator_id>temp</mtg:initiator_id>
<mtg:responder_id/>
</mtg:m_control>
<ce:m_content>
<ce:b_control>
<ce:reference>xyz</ce:reference>
</ce:b_control>
</ce:m_content>
</mtg:message>
实际输出
<?xml version="1.0" encoding="UTF-8"?>
<mtg:message xmlns:ce="http://www.origostandards.com/schema/ce/v2" xmlns:mtg="http://www.origostandards.com/schema/mtg/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<m_control xmlns="http://www.origostandards.com/schema/mtg/v2" id="m_control1">
<control_timestamp>2014-12-18T10:06:00-05:00</control_timestamp>
<message_id>c5-a4e0-aa0090358c7f</message_id>
<retry_number>0</retry_number>
<expected_response_type>synchronous</expected_response_type>
<initiator_id>temp</initiator_id>
<responder_id/>
</m_control>
<m_content xmlns="http://www.origostandards.com/schema/mtg/v2">
<b_control>
<reference>xyz</reference>
</b_control>
</m_content>
</mtg:message>
预期输出
<?xml version="1.0"?>
<mtg:message xmlns:ce="http://www.origostandards.com/schema/ce/v2" xmlns:mtg="http://www.origostandards.com/schema/mtg/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<mtg:m_control id="m_control1">
<mtg:control_timestamp>2014-12-18T10:06:00-05:00</mtg:control_timestamp>
<mtg:message_id>c5-a4e0-aa0090358c7f</mtg:message_id>
<mtg:retry_number>0</mtg:retry_number>
<mtg:expected_response_type>synchronous</mtg:expected_response_type>
<mtg:initiator_id>temp</mtg:initiator_id>
<mtg:responder_id/>
</mtg:m_control>
<ce:m_content>
<ce:b_control>
<ce:reference>xyz</ce:reference>
</ce:b_control>
</ce:m_content>
</mtg:message>
示例2-样式表正在按预期工作此输入xml
<message>
<m_control>
<control_timestamp>2014-11-05T09:30:38.308</control_timestamp>
<retry_number>0</retry_number>
<expected_response_type>synchronous</expected_response_type>
<responder_id>Exchange Life 1</responder_id>
</m_control>
</message>
预期和实际输出
<message xmlns="http://www.origoservices.com">
<m_control>
<control_timestamp>2014-11-05T09:30:38.308</control_timestamp>
<retry_number>0</retry_number>
<expected_response_type>synchronous</expected_response_type>
<responder_id>Exchange Life 1</responder_id>
</m_control>
</message>
我的样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions" xmlns:regexp="http://exslt.org/regular-expressions" extension-element-prefixes="dp" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="dp regexp exsl">
<xsl:output method="xml" indent="yes" version="1.0"/>
<xsl:variable name="origo-svc-ns" select="'http://www.origoservices.com'"/>
<!--xsl:template match="/message"-->
<xsl:template match="/*[local-name()='message']">
<xsl:variable name="name" select="name()"/>
<xsl:variable name="namespace-in" select="namespace-uri(/*[1])"/>
<xsl:variable name="initiator_id" select="/*[local-name()='message']/*[local-name()='m_control']/*[local-name()='initiator_id']"/>
<!--Below code tests if default namespace declaration is present. If not, then assigns the 'default namespace' to 'namespace' variable. Also, it assigns context variable "AddNamespace" with value "Y" if default namespace declaration is not present -->
<xsl:variable name="namespace">
<xsl:choose>
<xsl:when test="$namespace-in = '' and ($initiator_id = 'True Potential' or $initiator_id = '2Plan' or $initiator_id = '356356536' or $initiator_id = 'Assyst Software') ">
<xsl:value-of select="$origo-svc-ns"/>
<dp:set-variable name="'var://context/FL/AddNamspace'" value="'Y'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$namespace-in"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- - In below statement, {$namespace} will copy over the default namespace declarartion to the destination.
- copy-of select statement will copy over all the namespace declaration in the source xml
- apply-template will copy over evrything else from the source to destination
- xsl:element wil create an element node (in this case <message> ) in the destination document.
-->
<xsl:element name="{$name}" namespace="{$namespace}">
<xsl:copy-of select="namespace::*"/>
<xsl:apply-templates select="@*|node()|comment()|processing-instruction()|text()">
<xsl:with-param name="ns-uri" select="$namespace"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="node()">
<xsl:param name="ns-uri"/>
<xsl:element name="{local-name()}" namespace="{$ns-uri}">
<xsl:copy-of select="namespace::*"/>
<xsl:apply-templates select="@*|node()|comment()|processing-instruction()|text()">
<xsl:with-param name="ns-uri" select="$ns-uri"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="@*|comment()|processing-instruction()|text()">
<xsl:param name="ns-uri"/>
<xsl:copy>
<xsl:apply-templates select="@*|node()|comment()|processing-instruction()|text()">
<xsl:with-param name="ns-uri" select="$ns-uri"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML的示例具有默认名称空间 http://www.origoservices.com 是以下示例中的默认名称空间。
<message xmlns="http://www.origoservices.com" xmlns:a="https://www.bbb.com">
<m_control>
<control_timestamp>2014-11-05T09:30:38.308</control_timestamp>
<message_id>2840c35d-d294-4179-baa1-55ea2ce0b9ac</message_id>
<retry_number>0</retry_number>
<message_type>Quotation Request</message_type>
<message_version>/origo/3.7/QNBPensionAnnuityQuoteRequest.xsd</message_version>
<expected_response_type>synchronous</expected_response_type>
<initiator_id>Friends Provident</initiator_id>
<initiator_orchestration_id>2944460</initiator_orchestration_id>
<responder_id>Exchange Life 1</responder_id>
</m_control>
</message>
有点混乱,我不知道为什么您不使用<xsl:copy-of>
指令。
这样的样式表更简单,可以正确完成这项工作(我已经在第一个模板中删除了一些代码,因为我在这里感兴趣的问题没有找到任何用途:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:regexp="http://exslt.org/regular-expressions"
xmlns:ce="http://www.origostandards.com/schema/ce/v2"
xmlns:mtg="http://www.origostandards.com/schema/mtg/v2"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="dp regexp exsl">
<xsl:output method="xml" indent="yes" version="1.0"/>
<xsl:variable name="origo-svc-ns" select="'http://www.origoservices.com'"/>
<xsl:template match="/message">
<xsl:variable name="name" select="name()"/>
<!-- - In below statement, {$namespace} will copy over the default namespace declarartion to the destination.
- copy-of select statement will copy over all the namespace declaration in the source xml
- apply-template will copy over evrything else from the source to destination
- xsl:element wil create an element node (in this case <message> ) in the destination document.
-->
<xsl:element name="{$name}" namespace="{$origo-svc-ns}">
<!--xsl:copy-of select="namespace::*"/-->
<xsl:apply-templates select="@*|node()|comment()|processing-instruction()|text()" />
</xsl:element>
</xsl:template>
<xsl:template match="* | mtg:* | ce:*">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
一些解释:
- 首先,我声明
mtg
和ce
名称空间,以便可以在样式表中使用它们。 - 然后我匹配并处理
<message>
元素,而没有附加名称空间。此元素与附带的适当命名空间复制,并处理子元素 - 所有其他元素都简单地在输出中复制,所有子元素(和名称空间)。
我已经检查了两个条目(XML示例1和2)。
您的问题很难理解,即使不是不可能。与您以前的问题相同(其中是衍生),它缺乏明确的目的陈述。
如果我们假设您只希望您的样式表在默认命名空间(或无命名空间)中进行词根元素时执行某个转换,而当它不在默认的命名空间中,则在不使用的情况下进行另一个转换(即它具有前缀),则例如,这可以实现:
<xsl:template match="/">
<xsl:choose>
<xsl:when test="name(*)=local-name(*)">
<!-- root element is in a default or no namespace; apply transformation A -->
</xsl:when>
<xsl:otherwise>
<!-- root element has a prefix; apply transformation B -->
</xsl:otherwise>
</xsl:choose>
</xsl:template>