2016-07-22 114 views
1

我想从第三方软件中替换控件XML文件中的通配符。XSLT - 将每个XML属性值与特定属性值匹配并替换

不幸的是,这些通配符还用作此XML文件中的属性值。

我给你举个例子:

<control> 
    <some-tag id="$wildcard1$" version="3.14"> 
    <another-tag id="second_level">stackoverflow rocks!</another-tag> 
    </some-tag> 
    <some-tag id="foo" version="$wildcard2$"/> 
    <some-tag id="bar" version="145.31.1"/> 
</control> 

我试着写一个带参数的通用改造替换通配符的属性值。

我最大的问题是,我不知道属性名称。所以我需要匹配XML文件中的每个属性。这很容易但我如何匹配每个属性与特定的值(例如$通配符$)?

回答

1

这个问题的答案比我想象的要容易得多。

<xsl:template match="@*[. = $wildcard]"> 
    <xsl:attribute name="{name(.)}"> 
     <xsl:value-of select="$wildcard_value"/> 
    </xsl:attribute> 
</xsl:template> 

我希望它能帮助别人。

PS:这里是我的全XSL-改造替换属性值通配符:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:param name="wildcard" required="yes" /> 
    <xsl:param name="wildcard_value" required="yes" /> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" 
     indent="yes" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@*[. = $wildcard]"> 
     <xsl:attribute name="{name(.)}"> 
      <xsl:value-of select="$wildcard_value" /> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 
+2

注意'匹配= “[。= $ wildacard] */@ *”'可缩短至'比赛=“@ * [。= $ wildacard]”'。如果您确实使用XSLT 3.0版,那么您可以简单地声明''而不是第一个模板。我还注意到,你声明的参数名是'name ='通配符'',但你的代码引用'$ wildacard'。 –

+0

仅适用于撒克逊企业版。所以我决定将样式表标记为2.0版 – commandcraxx