XSLT 使用 local-name() 删除与另一个 namespaced/prefixed 节点同名的节点
XSLT Removing node having same name as with another namespaced/prefixed node using local-name()
我正在尝试从我的 XML 中删除 <create>
和 <accountNumber>
。
我设法删除了 <create>
并使用 //*[local-name()='create']
保留了它的子节点,这一切都很好。
问题:
<accountNumber>
与 <ns2:accountNumber>
同名
当我执行 //*[local-name()='accountNumber']
时,它会删除 <accountNumber>
和 <ns2:accountNumber>
。我想保留 <ns2:accountNumber>
样本输入XML
<root xmlns="http://xmlns.example.com/v1"
xmlns:ns2="http://xmlns.example/v2">
<accountNumber>1234567</accountNumber>
<create>
<ns2:profile>
<ns2:accountNumber>1234567</ns2:accountNumber>
</ns2:profile>
</create>
</root>
期望输出XML
<root xmlns="http://xmlns.example.com/v1"
xmlns:ns2="http://xmlns.example.com/v2">
<ns2:profile>
<ns2:accountNumber>1234567</ns2:accountNumber>
</ns2:profile>
</root>
我的XSL代码
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://xmlns.example.com/v1"
xmlns:ns2="http://xmlns.example.com/v2">
<xsl:output method="xml" encoding="utf-8" indent="yes" />
<!-- Copy all text nodes, elements and attributes -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template
match="//*[local-name()='create'] | //*[local-name()='accountNumber']">
<xsl:apply-templates select="*" />
</xsl:template>
</xsl:stylesheet>
我仍然想不出如何在不影响 namespaced/prefixed <ns2:accountNumber>
的情况下正确引用 <accountNumber>
如有任何帮助,我将不胜感激。
不要忽略命名空间,而是使用它:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://xmlns.example.com/v1">
<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="create">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="accountNumber"/>
</xsl:stylesheet>
我正在尝试从我的 XML 中删除 <create>
和 <accountNumber>
。
我设法删除了 <create>
并使用 //*[local-name()='create']
保留了它的子节点,这一切都很好。
问题:
<accountNumber>
与 <ns2:accountNumber>
当我执行 //*[local-name()='accountNumber']
时,它会删除 <accountNumber>
和 <ns2:accountNumber>
。我想保留 <ns2:accountNumber>
样本输入XML
<root xmlns="http://xmlns.example.com/v1"
xmlns:ns2="http://xmlns.example/v2">
<accountNumber>1234567</accountNumber>
<create>
<ns2:profile>
<ns2:accountNumber>1234567</ns2:accountNumber>
</ns2:profile>
</create>
</root>
期望输出XML
<root xmlns="http://xmlns.example.com/v1"
xmlns:ns2="http://xmlns.example.com/v2">
<ns2:profile>
<ns2:accountNumber>1234567</ns2:accountNumber>
</ns2:profile>
</root>
我的XSL代码
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://xmlns.example.com/v1"
xmlns:ns2="http://xmlns.example.com/v2">
<xsl:output method="xml" encoding="utf-8" indent="yes" />
<!-- Copy all text nodes, elements and attributes -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template
match="//*[local-name()='create'] | //*[local-name()='accountNumber']">
<xsl:apply-templates select="*" />
</xsl:template>
</xsl:stylesheet>
我仍然想不出如何在不影响 namespaced/prefixed <ns2:accountNumber>
<accountNumber>
如有任何帮助,我将不胜感激。
不要忽略命名空间,而是使用它:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://xmlns.example.com/v1">
<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="create">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="accountNumber"/>
</xsl:stylesheet>