如何在一个xsl文件中删除和添加命名空间

时间:2018-06-01 12:18:42

标签: xslt namespaces cluster-computing biztalk pipeline

我有两个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>

2 个答案:

答案 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中完成。

另外,你有一个双节点集群应该没关系。如果是,则表示完全不同的问题。