XSL 在调用模板时复制不需要的节点值
XSL copy undesired node value while calling templates
我有这个 XML,我需要对所有节点应用 2 个转换。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a> V1 </a>
<b> noo </b>
<a> v2</a>
<a> v3</a>
<b>noo</b>
<a> v4</a>
<a> v5</a>
<a> v6</a>
</root>
这 2 个转换必须按顺序进行:首先全部 "first_transformation",然后全部 "second_transformaiton"。
我用过这个 xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method='xml' version='1.0' encoding="UTF-8" indent="yes"/>
<xsl:template match="/*">
<xsl:apply-templates mode="t1"/>
<xsl:apply-templates mode="t2"/>
</xsl:template>
<xsl:template match="//a" mode="t1" >
<xsl:element name="first_transformation">
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:template>
<xsl:template match="//a" mode="t2" >
<xsl:element name="second_transformation">
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
如您所见,我为每个转换使用两个模板,并在 "main" 模板中调用它们。
我的输出是:
<?xml version="1.0" encoding="UTF-8"?>
<first_transformation> V1 </first_transformation>
noo
<first_transformation> v2</first_transformation>
<first_transformation> v3</first_transformation>
noo
<first_transformation> v4</first_transformation>
<first_transformation> v5</first_transformation>
<first_transformation> v6</first_transformation>
<second_transformation> V1 </second_transformation>
noo
<second_transformation> v2</second_transformation>
<second_transformation> v3</second_transformation>
noo
<second_transformation> v4</second_transformation>
<second_transformation> v5</second_transformation>
<second_transformation> v6</second_transformation>
如您所见,我从保持 beein 复制的 b 节点中获得了这些 "noo" 值。
你知道我怎样才能让它们从我的输出中消失吗?
谢谢!
内置模板规则默认复制text()
个节点(link):
The built-in rule for any element is to process its child elements and text nodes.
因此您必须为每种模式覆盖此行为。
因此将这两个模板添加到您的样式表中:
<xsl:template match="text()" mode="t1" />
<xsl:template match="text()" mode="t2" />
这将删除所有多余的 "noo" text()
节点。
或者简单地说:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='xml' version='1.0' encoding="UTF-8" indent="yes"/>
<xsl:template match="/*">
<xsl:apply-templates select="a" mode="t1"/>
<xsl:apply-templates select="a" mode="t2"/>
</xsl:template>
<xsl:template match="a" mode="t1" >
<first_transformation>
<xsl:value-of select="."/>
</first_transformation>
</xsl:template>
<xsl:template match="a" mode="t2" >
<second_transformation>
<xsl:value-of select="."/>
</second_transformation>
</xsl:template>
</xsl:stylesheet>
请注意,结果是一个 XML 片段,因为它没有根元素。
我有这个 XML,我需要对所有节点应用 2 个转换。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a> V1 </a>
<b> noo </b>
<a> v2</a>
<a> v3</a>
<b>noo</b>
<a> v4</a>
<a> v5</a>
<a> v6</a>
</root>
这 2 个转换必须按顺序进行:首先全部 "first_transformation",然后全部 "second_transformaiton"。
我用过这个 xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method='xml' version='1.0' encoding="UTF-8" indent="yes"/>
<xsl:template match="/*">
<xsl:apply-templates mode="t1"/>
<xsl:apply-templates mode="t2"/>
</xsl:template>
<xsl:template match="//a" mode="t1" >
<xsl:element name="first_transformation">
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:template>
<xsl:template match="//a" mode="t2" >
<xsl:element name="second_transformation">
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
如您所见,我为每个转换使用两个模板,并在 "main" 模板中调用它们。
我的输出是:
<?xml version="1.0" encoding="UTF-8"?>
<first_transformation> V1 </first_transformation>
noo
<first_transformation> v2</first_transformation>
<first_transformation> v3</first_transformation>
noo
<first_transformation> v4</first_transformation>
<first_transformation> v5</first_transformation>
<first_transformation> v6</first_transformation>
<second_transformation> V1 </second_transformation>
noo
<second_transformation> v2</second_transformation>
<second_transformation> v3</second_transformation>
noo
<second_transformation> v4</second_transformation>
<second_transformation> v5</second_transformation>
<second_transformation> v6</second_transformation>
如您所见,我从保持 beein 复制的 b 节点中获得了这些 "noo" 值。
你知道我怎样才能让它们从我的输出中消失吗? 谢谢!
内置模板规则默认复制text()
个节点(link):
The built-in rule for any element is to process its child elements and text nodes.
因此您必须为每种模式覆盖此行为。
因此将这两个模板添加到您的样式表中:
<xsl:template match="text()" mode="t1" />
<xsl:template match="text()" mode="t2" />
这将删除所有多余的 "noo" text()
节点。
或者简单地说:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='xml' version='1.0' encoding="UTF-8" indent="yes"/>
<xsl:template match="/*">
<xsl:apply-templates select="a" mode="t1"/>
<xsl:apply-templates select="a" mode="t2"/>
</xsl:template>
<xsl:template match="a" mode="t1" >
<first_transformation>
<xsl:value-of select="."/>
</first_transformation>
</xsl:template>
<xsl:template match="a" mode="t2" >
<second_transformation>
<xsl:value-of select="."/>
</second_transformation>
</xsl:template>
</xsl:stylesheet>
请注意,结果是一个 XML 片段,因为它没有根元素。