使用 XSLT 将 XML 转换为 XML(添加、删除、修改) [英] XML to XML conversion with XSLT (Add, delete, modify)

查看:43
本文介绍了使用 XSLT 将 XML 转换为 XML(添加、删除、修改)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 XSLT 从一个 XML (XHTML) 文件转换为另一个文件.我必须添加一些新元素和属性,删除一些元素和属性以及更新一些现有属性的值.因此,在本论坛提供的宝贵帮助下,我可以按照上一个问题的答案完成许多任务:XML to XML with XSLT- Add, Remove, Modify Elements and Attributes 但是当元素具有相同的名称和一个相同属性.那时我无法区分它进行修改.例如:我在 div 标签之后有两个 type="t/j" 脚本,其中 id="123" 和一个 type="t/j" 脚本在 head 标签内.我必须删除 src="abc.js" 的脚本元素,只有当它出现在 div 标签之后(不在 head 标签内)并将 xyz.js 的值更改为 lmn.js 时.我已在我的来源和所需文件中就修订发表了评论.为了消除 onClick 事件,我传递了一个模板匹配,它不使用 @onClick 做任何事情,它根据要求从任何地方删除 onClick 事件.但是,当我应用相同的技术从特定位置(在源文件中注释)删除span"标签时,它不仅会从那里删除,而且还会从我不想删除的所有其他地方删除.请在下面找到我的 XML 文件-

源文件:

<html xmlns="http://www.w3.org/1999/xhtml"><头><meta http-equiv="Content-type" content="text/html; charset=utf-8"/><script type="t/j" src="abc.js"></script><身体><div id="o"><div id="m"><div id="nD"><p id="nT">第 1 部分

<div class="TF" id="123"><!--将 XYZ.JS 的值更改为 LMN.JS--><script type="t/j" src="xyz.js"></script><!--删除此脚本--><script type="t/j" src="abc.js"></script><div class="iD"><img alt="" src="ic.gif"/><span class="iDe">ABC</span><br/><div class="iDev"><div id="ta12" class="bl" style="dis:bl"></div><div class="q"><br/><br/><!--从这里移除跨度标记--><div id="ta12" class="bl" style="dis:bl">1<span style="color: #000000;">XYZ</span>

<!--删除点击事件--><br/>T <input type="radio" name="op12" id="t12" onclick="getFeedback()"/>F <input type="radio" name="op12" id="f12" onclick="getFeedback()"/><div>C</div><div>在</div><div><div></div>

</body></html>

所需文件:

<html xmlns="http://www.w3.org/1999/xhtml"><头><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><script type="t/j" src="abc.js"></script><script type="t/j" src="pqr.js"></script><script type="t/j" src="stu.js"></script><body onload="load()" onunload="unload()"><div id="o"><div id="m"><div id="nD"><p id="nT">第1部分</p></div>

<script type="t/j" src="lmn.js"></script><form name="form1" id="q8" action="js:cal();"><div class="iD"><img alt="" src="ic.gif"/><span class="iDe">ABC</span><div class="iDev"><!--添加这个 DIV 标签--><div class="pa" value="10"></div><div class="q"><div id="ta8" class="bl" style="dis:bl">XYZ</div><br/><input type="radio" name="ke8" value="0"/><div id="tab8" class="bl" style="dis:bl">T

<input type="radio" name="ke8" value="1"/><div id="tab8" class="bl" style="dis:bl">F

<br/><input type="submit" name="sub" value="Done"/></div></div></表单>

</body></html>

我使用的是 XSLT 1.0.因此,根据建议和一些修改(尽管在某些地方有所不同,例如 id="1"),我的 XSLT 如下所示:更新

<xsl:output method="xml" indent="yes" encoding="UTF-8"/><xsl:strip-space elements="*"/><xsl:template match="@*|node()"><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:模板><xsl:template match="xhtml:body"><script type="t/j" src="pqr.js"></script><script type="t/j" src="stu.js"></script><body onload="loadPage()" onunload="unloadPage()"><xsl:apply-templates select="@*|node()"/></xsl:模板><xsl:template match="xhtml:div[@id='123']/@class"><xsl:attribute name="class">QT</xsl:attribute><xsl:attribute name="id">456</xsl:attribute></xsl:模板><xsl:template match="xhtml:script[@src='xyz.js']"><xsl:copy><xsl:apply-templates select="@*[not(@src)]"/><xsl:attribute name="src">lmn.js</xsl:attribute><xsl:apply-templates select="node()"/></xsl:copy></xsl:模板><xsl:template match="xhtml:body//xhtml:script[@src='abc.js']"/><xsl:template match="xhtml:div[@class='iD']"><表格名称=表格"><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy><xsl:apply-templates select="following-sibling::xhtml:div[1]" mode="inside-form"/><br/><input type="submit" name="sub" value="Done"/></表单></xsl:模板><xsl:template match="xhtml:div[@id='ta12']"><xsl:attribute name="class">pa</xsl:attribute><xsl:attribute name="value">10</xsl:attribute></xsl:模板><xsl:template match="xhtml:div[@class='iDev']"><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy><div id="ta8" class="bl" style="dis:bl">XYZ</div><br/><input type="radio" name="ke8" value="0"/><div id="tab8" class="bl" style="dis:bl">T</div><input type="radio" name="ke8" value="1"/><div id="tab8" class="bl" style="dis:bl">F</div></xsl:模板></xsl:stylesheet>

我得到的输出-

<script type="t/j" src="pqr.js"/><script type="t/j" src="stu.js"/><body onload="loadPage()" onunload="unloadPage()"><div id="o"><div id="m"><div id="nD"><p id="nT">第 1 部分

<!--类的值已更改,但 ID 未更改-->

<script type="t/j" src="lmn.js" xml:space="preserve"/><表格名称=表格"><div class="iD"><img alt="" src="ic.gif"/><span class="iDe">ABC</span><br clear="none"/><!--缺少 CLASS=IDEV 的 DIV 标记-->

<div class="q"><!--BR 已经以属性清除出现--><br clear="none"/><br clear="none"/><!--输入标签出现了两次--><br clear="none"/>T <input type="radio" name="op12" id="t12" onclick="getFeedback()"/>F <input type="radio" name="op12" id="f12" onclick="getFeedback()"/><div>C</div><div>在</div><div><div/>

<div id="ta8" class="bl" style="dis:bl">XYZ</div><br/><input type="radio" name="ke8" value="0"/><div id="tab8" class="bl" style="dis:bl">T</div><input type="radio" name="ke8" value="1"/><div id="tab8" class="bl" style="dis:bl">F</div>

<br/><input type="submit" name="sub" value="Done"/></表单>

</html>

谢谢!

解决方案

在 90% 的 XSLT 问题中,最大的挑战不是问题的技术方面,而是如何用匹配模式和相应的输出.而不是给你一个样式表,我会给你一个模式 &你的问题的输出视图.您应该能够从中制作样式表.不涉及特殊技术.

比较你的输入和输出文档,我将描述转换规则如下.

  1. 将输入文档复制到输出,但有以下例外情况.
  2. 在 前面加上以下文字

    
    
    
    
            
            
            
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆