我有两个xsl文件连接到BizTalk接收位置的管道。一个从接收的消息中删除命名空间,一个添加命名空间。由于BizTalk应用程序在双节点群集上运行,因此xsl-files并不总是在同一节点上执行。这会导致邮件被暂停。是否可以在一个xsl文件中删除和添加命名空间?
我是xslt的新手,有人能给我一些线索吗?
这是第一个xsl-code删除命名空间:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes"/>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
<xsl:template match="text() | comment() | processing-instruction()">
<xsl:copy />
</xsl:template>
</xsl:stylesheet>
这是第二个xsl-code添加命名空间:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var" version="1.0" xmlns:utFil="http://www.healthxml.org/Schemas/CEN/1613/2001/01/LaboratoryServiceRequest">
<xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" version="1.0"/>
<xsl:template match="*">
<xsl:copy><xsl:apply-templates/></xsl:copy>
</xsl:template>
<xsl:template match="*[namespace-uri()='']">
<xsl:element name="{local-name()}" namespace="http://www.healthxml.org/Schemas/CEN/1613/2001/01/LaboratoryServiceRequest/kit">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
通过使用XSLT添加名称空间,你不会感到遥远,因为它并没有真正向现有元素添加名称空间,而是在新的名称空间中创建具有相同本地名称的新元素。您只需更改模板即可为所有元素执行此操作,而不仅仅是无命名空间中的元素
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" version="1.0"/>
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="http://www.healthxml.org/Schemas/CEN/1613/2001/01/LaboratoryServiceRequest/kit">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
<xsl:template match="text() | comment() | processing-instruction()">
<xsl:copy />
</xsl:template>
</xsl:stylesheet>
注意,如果您有两个具有相同本地名称但名称空间不同的属性,则可能会出现问题,尽管这种情况可能并不常见。例如:
<test xmlns:a="a" a:attr="1" attr="1" />
答案 1 :(得分:1)
所以,你真正在做的是更改命名空间,我担心你会让它变得比需要的更复杂。
您需要的是使用Mass Copy Functoid 的新目标命名空间和Mapper文件的架构。
为清楚起见,我说你应该不使用自定义xlst ,这可以在端口上指定的一个Map中完成。
另外,你有一个双节点集群应该没关系。如果是,则表示完全不同的问题。