我有一个XML,我想用以下xslt:将属性值(name="name")更改为另一个(name="value")
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--xsl:template match="text()"-->
<!--xsl:text select="." disable-output-escaping="yes" /-->
<!--xsl:value-of select="." disable-output-escaping="yes" />
<xsl:copy-of select="child::*"/>
</xsl:template-->
<xsl:template match="@*|node()" mode="s">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="s"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" mode="se">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="se"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@name" mode="se">
<xsl:attribute name="name">value</xsl:attribute>
</xsl:template>
<xsl:template match="tag5[@type='testtype']">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="s"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tag6[@name='name']" mode="s">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="se"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML INPUT片段:
<?xml version="1.0" encoding="UTF-8"?>
<dataroot version="2.0">
<Model id="111" name="test">
<tag1 id="222" type="VERSION">
<tag2 id="333" name="Version" value="2"/>
</tag1>
<tag3 id="444">
<tag4 id="555" versionID="test/00001" name="name" definition="through test. 
" attrs="12 23"/>
<tag4 id="666" versionID="test/00001" name="name" definition="through test 2. 
" messages="34 45"/>
</tag3>
<tag5 id="777" type="testtype">
<tag6 id="888" name="name" value="667"/>
<tag6 id="999" name="context" value="FIX 5.0"/>
</tag5>
</Model>
</dataroot>
应用xslt后的XML OUTPUT是:
<?xml version="1.0" encoding="UTF-8"?>
<dataroot version="2.0">
<Model id="111" name="test">
<tag1 id="222" type="VERSION">
<tag2 id="333" name="Version" value="2"/>
</tag1>
<tag3 id="444">
<tag4 id="555" versionID="test/00001" name="name" definition="through test. " attrs="12 23"/>
<tag4 id="666" versionID="test/00001" name="name" definition="through test 2. " messages="34 45"/>
</tag3>
<tag5 id="777" type="testtype">
<tag6 id="888" name="value" value="667"/>
<tag6 id="999" name="context" value="FIX 5.0"/>
</tag5>
</Model>
</dataroot>
xslt基本上完成了预期的操作。然而,通过意外的转换:

 -> (unexpected transform)
我想保留原始实体。我尝试过禁用输出转义(请参阅xslt中的注释部分,将文本更改为@definition),但不起作用。有什么建议吗?
我使用xsltproc btw.
提前感谢!
xslt似乎无法处理这个需求,所以我在perl中完成了它。谢谢大家!