如何处理目标元素类型列表?
How to handle target element type list?
我需要用于处理特定元素类型的模板。
我不想提供一种元素类型,而是提供元素类型列表作为参数。例如。
<xsl:param name="element_type" select="'hdd;dvd-rom'"/>
我需要如何处理这样的输入?
接下来是设计模板(只处理一种元素类型)。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:param name="element_type" select="'hdd'"/>
<xsl:param name="old_value" select="'2016'"/>
<xsl:param name="new_value" select="'xxxx'"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[local-name() eq $element_type]/@name[contains(., $old_value)]">
<xsl:attribute name="{name()}" select="replace(., $old_value, $new_value)"/>
</xsl:template>
</xsl:stylesheet>
下面是示例XML。
<?xml version="1.0" encoding="utf-8"?>
<desktop>
<hdd name="2016-1"/>
<dvd-rom name="2016-2"/>
<cd-rom name="2016-3"/>
</desktop>
如果你想要一个序列(XSLT/XPath 中没有列表)然后使用 select="'hdd', 'dvd-rom'"
然后使用 local-name() = $element_type
.
根据您设置参数的方式,传递带有逗号或分号或类似分隔符的字符串可能更容易,就像您在 <xsl:param name="element_type" select="'hdd;dvd-rom'"/>
中所做的那样,然后使用 <xsl:variable name="element_types" select="tokenize($element_type, ';')"/>
获取序列在比较中你终于可以使用 local-name() = $element_types
.
我需要用于处理特定元素类型的模板。
我不想提供一种元素类型,而是提供元素类型列表作为参数。例如。
<xsl:param name="element_type" select="'hdd;dvd-rom'"/>
我需要如何处理这样的输入?
接下来是设计模板(只处理一种元素类型)。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:param name="element_type" select="'hdd'"/>
<xsl:param name="old_value" select="'2016'"/>
<xsl:param name="new_value" select="'xxxx'"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[local-name() eq $element_type]/@name[contains(., $old_value)]">
<xsl:attribute name="{name()}" select="replace(., $old_value, $new_value)"/>
</xsl:template>
</xsl:stylesheet>
下面是示例XML。
<?xml version="1.0" encoding="utf-8"?>
<desktop>
<hdd name="2016-1"/>
<dvd-rom name="2016-2"/>
<cd-rom name="2016-3"/>
</desktop>
如果你想要一个序列(XSLT/XPath 中没有列表)然后使用 select="'hdd', 'dvd-rom'"
然后使用 local-name() = $element_type
.
根据您设置参数的方式,传递带有逗号或分号或类似分隔符的字符串可能更容易,就像您在 <xsl:param name="element_type" select="'hdd;dvd-rom'"/>
中所做的那样,然后使用 <xsl:variable name="element_types" select="tokenize($element_type, ';')"/>
获取序列在比较中你终于可以使用 local-name() = $element_types
.