我正在尝试替换一些节点值。这个想法是在其他结构中搜索具有相同名称的节点并替换该值。
在这里,我将 Body/A 的值更改为 Rule/A,Body/C/D 的值更改为 Rule/D。
像这样的东西。
<Message>
<XMLNSC>
<MaXML>
<Rule>
<A>RuleA</A>
<D>RuleD</D>
<E>RuleE</E>
</Rule>
<Body>
<A>valA</A>
<B>valB</B>
<C>
<D>valD</D>
</C>
</Body>
</MaXML>
</XMLNSC>
对此。
<Message>
<XMLNSC>
<MaXML>
<Rule>
<A>RuleA</A>
<D>RuleD</D>
<E>RuleE</E>
</Rule>
<Body>
<A>RuleA</A>
<B>valB</B>
<C>
<D>RuleD</D>
</C>
</Body>
</MaXML>
</XMLNSC>
目前我正在遍历所有子节点,搜索节点名称之间的匹配,但是我应该如何保持相同的结构并只更改值?
<?xml version="1.0" encoding="utf-8"?>
<xsl:output method="xml" indent="yes"/>
<!-- copy all -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- match Body -->
<xsl:template match="Body">
<Body>
<!-- all children from body -->
<xsl:for-each select="descendant::*">
<xsl:variable name="maNode" select="."/>
<xsl:variable name="nodeName" select="name()"/>
<!-- all rules -->
<xsl:for-each select="//Rule/*">
<xsl:variable name="varRuleName" select="name()"/>
<xsl:choose>
<!-- match rule -->
<xsl:when test="$nodeName = $varRuleName">
<element name="match"/>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<element name="unmatch"/>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
</Body>
</xsl:template>