从特定节点中删除命名空间,将结果用于第二次 xslt(version1.0) 转换

Remove namespace from a specific node, use the result for 2nd xslt(version1.0) transformation

我是 XSLT 的新手,我发现这个概念有点难以理解;有什么书或 link 建议吗?

我正在尝试从 customerinfo 节点及其所有子节点(即 customerinfo、姓名和年龄)中删除名称空间。删除名称空间后,我想使用生成的 xml 作为其他 xslts 的输入?

XML 1:

    <uc:cpy xmlns:uc="http://oldcompany.com">
     <customerinfo xmlns="http://oldcompany.com" xmlns:d="http://test" Cid="1004" fid="aa">
        <name xmlns="http://oldcompany.com">Matt Foreman</name>
        <age xmlns="http://oldcompany.com">26</age>
     </customerinfo>

     <uc:prodcut xmlns="http://oldcompany.com" xmlns:d="http://test" >
        <uc:item>Hammer</uc:item>
        <uc:quantity>1</uc:quantity>
     </uc:prodcut> 
    </uc:cpy>

XML 2:移除命名空间后;保持属性值不变:

    <uc:cpy xmlns:uc="http://oldcompany.com">
     <customerinfo Cid="1004" fid="aa">
        <name>Matt Foreman</name>
        <age>26</age>
     </customerinfo>

     <uc:prodcut xmlns="http://oldcompany.com" xmlns:d="http://test" >
        <uc:item>Hammer</uc:item>
        <uc:quantity>1</uc:quantity>
     </uc:prodcut> 
    </uc:cpy>

最后,将 xml 2 作为文档中其他 xslt 模板导入的输入。

I am trying to remove the namespace from customerinfo node and all its child nodes i.e. customerinfo,name and age.

如果你事先知道customerinfo的所有子(或后代)节点的名称,你可以这样做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:uc="http://oldcompany.com">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="uc:customerinfo | uc:name | uc:age" >
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

否则做一些更一般的事情,比如:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:uc="http://oldcompany.com">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*[ancestor-or-self::uc:customerinfo]" >
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

请注意,这两种方法都假定属性在命名空间中是而不是(即可以直接复制)。


Finally, pass the xml 2 as input for other xslt template imports on the document.

这是您的调用应用程序的任务,不是您可以在 XSLT 本身中完成的任务。我不确定为什么您需要分两步开始 - 为什么不编写一个样式表来完成所有工作?