2016-07-22 93 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