我正在尝试找到一种方法来获取节点的名称并通过用值替换变量来编辑它。
例:
<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>
我没有更改元素中的任何内容,但我正在更改节点的名称。
看起来您想为 mbean
元素的 name
属性编写模板,例如
<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>