英文:
Rename Multiple XML tags to different name
问题
我正在寻求将标签转换为其他格式,但只转换父标签,而不转换子标签。
我希望在不改变结构的情况下转换标签。
例如:
<section name="ABC">
<section name="123">
<p>Data</p>
<p>Data</p>
<p>Data</p>
</section>
<section name="456">
<table>
<tr>
<td><p>Data</p></td>
<td><p>Data</p></td>
<td><p>Data</p></td>
</tr>
</table>
</section>
<section name="232">
<bold><p>Data</p></bold>
</section>
</section>
转换为:
<div class="ABC">
<div class="123">
<h1>Data</h1>
<h1>Data</h1>
<h1>Data</h1>
</div>
<div class="456">
<table>
<tr>
<td><h1>Data</h1></td>
<td><h1>Data</h1></td>
<td><h1>Data</h1></td>
</tr>
</table>
</div>
<div class="232">
<bold><h1>Data</h1></bold>
</div>
</div>
这是我在XSLT转换中编写的代码。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="section">
<div class="{@name}">
<xsl:apply-templates select="node()"/>
</div>
</xsl:template>
<xsl:template match="p">
<h1>
<xsl:apply-templates select="node()"/>
</h1>
</xsl:template>
<xsl:template match="table">
<table>
<xsl:apply-templates select="node()"/>
</table>
</xsl:template>
<xsl:template match="tr">
<tr>
<xsl:apply-templates select="node()"/>
</tr>
</xsl:template>
<xsl:template match="td">
<td>
<xsl:apply-templates select="node()"/>
</td>
</xsl:template>
<xsl:template match="image">
<img>
<xsl:apply-templates select="node()"/>
</img>
</xsl:template>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
一切都运行正常,但所有属性都被删除,我只得到标签而不是属性值。我想要保留所有属性并仅更改特定属性的名称。
英文:
I am looking to transform tag to other format but it is transform only parent tags not child tags.
I want to transform the tag without change in the structure.
Eg:
<section name="ABC">
<section name="123">
<p>Data</p>
<p>Data</p>
<p>Data</p>
</section>
<section name="456">
<table>
<tr>
<td><p>Data</p></td>
<td><p>Data</p></td>
<td><p>Data</p></td>
</tr>
</table>
</section>
<section name="232">
<bold><p>Data</p></bold>
</section>
</section>
to
<div class="ABC">
<div class="123">
<h1>Data</h1>
<h1>Data</h1>
<h1>Data</h1>
</div>
<div class="456">
<table>
<tr>
<td><h1>Data</h1></td>
<td><h1>Data</h1></td>
<td><h1>Data</h1></td>
</tr>
</table>
</div>
<div class="232">
<bold><h1>Data</h1></bold>
</div>
</div>
This is what i have written in XSLT transformation.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="section"><div><xsl:apply-templates select="node()"/></div></xsl:template>
<xsl:template match="p"><p><xsl:apply-templates select="node()"/></p></xsl:template>
<xsl:template match="table"><table><xsl:apply-templates select="node()"/></table></xsl:template>
<xsl:template match="row"><tr><xsl:apply-templates select="node()"/></tr></xsl:template>
<xsl:template match="cell"><td><xsl:apply-templates select="node()"/></td></xsl:template>
<xsl:template match="image"><img><xsl:apply-templates select="node()"/></img></xsl:template>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Every thing is working fine but all attributes are getting timed i am getting only tags but not attribute values. I want to apply all attributes to be preserved and change name of specific attribute alone.
答案1
得分: 1
这应该可以完成任务:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="section"><div><xsl:apply-templates select="@*|node()"/></div></xsl:template>
<xsl:template match="p"><h1><xsl:apply-templates select="@*|node()"/></h1></xsl:template>
<xsl:template match="table"><table><xsl:apply-templates select="@*|node()"/></table></xsl:template>
<xsl:template match="row"><tr><xsl:apply-templates select="@*|node()"/></tr></xsl:template>
<xsl:template match="cell"><td><xsl:apply-templates select="@*|node()"/></td></xsl:template>
<xsl:template match="image"><img><xsl:apply-templates select="@*|node()"/></img></xsl:template>
<xsl:template match="@name"><xsl:attribute name="class"><xsl:value-of select="."/></xsl:attribute></xsl:template>
<!-- identity transformation -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
英文:
That should do the Job:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="section"><div><xsl:apply-templates select="@*|node()"/></div></xsl:template>
<xsl:template match="p"><h1><xsl:apply-templates select="@*|node()"/></h1></xsl:template>
<xsl:template match="table"><table><xsl:apply-templates select="@*|node()"/></table></xsl:template>
<xsl:template match="row"><tr><xsl:apply-templates select="@*|node()"/></tr></xsl:template>
<xsl:template match="cell"><td><xsl:apply-templates select="@*|node()"/></td></xsl:template>
<xsl:template match="image"><img><xsl:apply-templates select="@*|node()"/></img></xsl:template>
<xsl:template match="@name"><xsl:attribute name="class"><xsl:value-of select="."/></xsl:attribute></xsl:template>
<!-- identity transformation -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论