0

ノードの名前を取得し、変数を値に置き換えて編集する方法を見つけようとしています。

例:

<mbean code="abc.def.ghi" name="com.ijk.lmn:name=@value1@"> 
    <attribute name="storename">value</attribute> 
    <depends optional-attribute-name="bookname">value2</depends> 
    <attribute name="Type">ebook</attribute> 
    <attribute name="Properties"> 
    bookName=value3
    booktype=value4
</mbean>

期待される出力:

<mbean code="abc.def.ghi" name="com.ijk.lmn:name=newvalue"> 
    <attribute name="storename">value</attribute> 
    <depends optional-attribute-name="bookname">value2</depends> 
    <attribute name="Type">ebook</attribute> 
    <attribute name="Properties"> 
    bookName=value3
    booktype=value4
</mbean>

私はこのxslコードでテストしましたが、私が望んでいたものをキャプチャしていない方法がいくつかあります:

<xsl:template match="mbean[@name]">
    <xsl:copy>  
    <xsl:apply-templates select="@*"/>
    <xsl:analyze-string select="." regex="([\w.]+)=@(.*?)@">
        <xsl:matching-substring>    
            Value1: <xsl:value-of select="regex-group(1)"/>
            Value2: <xsl:value-of select="regex-group(2)"/>     
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
    </xsl:copy>    
</xsl:template> 

要素は何も変更していませんが、ノードの名前を変更しています。

4

1 に答える 1

1

要素のname属性のテンプレートを書きたいようです。mbean

<xsl:template match="mbean/@name">
  <xsl:variable name="tokens" select="tokenize(., '=')"/>
  <xsl:attribute name="{node-name(.)}" select="concat($tokens[1], '=', 'newvalue')"/>
</xsl:template>

もちろん、新しい値として文字列リテラルを使用しましたが、その代わりに値を調べることができます。

new-values.xmlたとえば、外部ドキュメントがある場合

<values>
  <value key="com.ijk.lmn:name">new value</value>
</values>

次に、グローバル パラメータを定義します

<xsl:param name="value-url" select="'new-values.xml'"/>

グローバル変数

<xsl:variable name="value-doc" select="doc($value-url)"/>

そして鍵

<xsl:key name="kv" match="value" use="@key"/>

そして使用する

<xsl:template match="mbean/@name">
  <xsl:variable name="tokens" select="tokenize(., '=')"/>
  <xsl:attribute name="{node-name(.)}" select="concat($tokens[1], '=', key('kv', $token[1], $value-doc))"/>
</xsl:template>
于 2013-10-01T09:05:29.873 に答える