如何捕获节点的名称并用值替换变量

时间:2013-10-01 04:21:58

标签: xml xslt replace xslt-1.0 xslt-2.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> 

我没有更改元素中的任何内容,但我正在更改节点的名称。

1 个答案:

答案 0 :(得分: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>