0

我是 XSLT 的新手,我发现这个概念有点难以掌握;任何书籍或链接建议?

我正在尝试从customerinfo 节点及其所有子节点(即customerinfo、name 和age)中删除命名空间。删除命名空间后,我想使用生成的 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 模板导入的输入。

4

1 回答 1

0

我正在尝试从customerinfo 节点及其所有子节点(即customerinfo、name 和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>

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


最后,传递 xml 2 作为文档上其他 xslt 模板导入的输入。

这是您的调用应用程序的任务,而不是您可以在 XSLT 本身中完成的任务。我不知道为什么你需要分两步开始——为什么不写一个样式表来完成这一切呢?

于 2017-04-25T21:54:04.717 回答