我正在尝试找到一种方法来获取节点的名称,并通过用值替换变量来编辑它。
示例:
<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>
我没有更改元素中的任何内容,但我正在更改节点的名称。
答案 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>