2016-09-14 52 views
1

我需要用于处理特定元素类型的模板。
我想提供的不是一种元素类型,而是元素类型列表作为参数。例如。如何处理目标元素类型列表?

<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> 

回答

1

如果你想有一个序列(也有在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

+0

非常感谢! – senleft