从特定节点中删除命名空间,将结果用于第二次 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 本身中完成的任务。我不确定为什么您需要分两步开始 - 为什么不编写一个样式表来完成所有工作?
我是 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 本身中完成的任务。我不确定为什么您需要分两步开始 - 为什么不编写一个样式表来完成所有工作?