我有一个XML文件,应该仅根据其属性值为某些元素应用转换规则,其余部分应保留原样。
<bigdata>
<data>
<Object class="QWE" Name="Country-1/State-1/QWE-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
<Object class="RTY" Name="Country-1/State-1/RTY-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
<Object class="UIO" Name="Country-1/State-1/UIO-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
<Object class="PAS" Name="Country-1/State-1/PAS-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
</data>
上面的xml应该转换为xml片段,其中只有 class 等于QWE的xml元素 Object 应该更改为 POST 。 即只有第一个元素必须根据其属性进行更改。 对此的任何建议都将是非常感激的
<bigdata>
<data>
<Object class="POST" Name="Country-1/State-1/POST-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
<Object class="RTY" Name="Country-1/State-1/RTY-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
<Object class="UIO" Name="Country-1/State-1/UIO-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
<Object class="PAS" Name="Country-1/State-1/PAS-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
</data>
答案 0 :(得分:1)
试试这个:
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Object/@class[. = 'QWE' ]">
<xsl:attribute name="class">
<xsl:value-of select="'POST'"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
将生成以下输出:
<bigdata>
<data>
<Object class="POST" Name="Country-1/State-1/QWE-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
<Object class="RTY" Name="Country-1/State-1/RTY-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
<Object class="UIO" Name="Country-1/State-1/UIO-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
<Object class="PAS" Name="Country-1/State-1/PAS-1">
<p name="Map">20</p>
<p name="Required">0</p>
<p name="Combined">68</p>
<p name="State">0</p>
</Object>
</data>
</bigdata>
如果类值应以字符串(QWE)开头并且只应替换此部分,则更新。试试这个:
<xsl:template match="Object/@class[starts-with(., 'QWE') ]">
<xsl:attribute name="class">
<xsl:value-of select="'POST'"/>
<xsl:value-of select="substring-after(.,'QWE')"/>
</xsl:attribute>
</xsl:template>
答案 1 :(得分:0)
使用以下XSLT转换上面的xml:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@class[parent::Object]">
<xsl:choose>
<xsl:when test=".='QWE'">
<xsl:attribute name="class">
<xsl:value-of select="'POST'"/>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="class">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
请参阅以获取更多信息: