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