2016-07-22 15 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は:マッチ= "[。= $ wildacard] */@ *" `マッチ`に短縮することができ

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

注 'こと:ここでは、属性値にワイルドカードを交換する私の完全なXSL-変換であります= "@ * [。= $ wildacard]" '。最初のテンプレートの代わりにXSLTバージョン3.0を実際に使用している場合は、単に 'を宣言できます。あなたの宣言されたparam名は 'name =" wildcard "'ですが、あなたのコードは '$ wildacard'を参照しています。 –

+0

は、サクソンエンタープライズ版でのみ動作します。だから私はバージョン2.0としてスタイルシートにタグを付けることにしました – commandcraxx

関連する問題