XSLT转换xml文件的案例

XML文件:

<?xml version="1.0" encoding="utf-8"?>
<doc>
<html>

<table a="b"></table>
<table style="a:b;" a="b"></table>
<table style="WIDTH:100px;" a="b"></table>
<table style="WIDTH:100PX;">
	<th TEXT-ALIGN='10' a="a">
		<td BACKGROUND-COLOR="red" TEXT-ALIGN='20' a='b'>1</td>
	</th>
</table>
<span style="TEXT-DECORATION:underline"><a>ABC</a></span>
<span style="text-decoration:underline"><a>ABC</a></span>
<span style="TEXT-DECORATION:underline" a="b"><a>ABC</a></span>
<span style="color:#ff3300">dfafadssfas</span>
<span style="COLOR:#0033ff">dfafadssfas </span>
<span style="color:red"><a>EFG</a></span>
<p style="COLOR:#ff3300">dfafadssfas </p>
<p style="COLOR:#0033ff">dfafadssfas </p>
<p style="align:center">dfafadssfas </p>

<ul>
  <li>
   	 <p>1</p>
    <ul>
      <li>
        <p><span style="TEXT-DECORATION:underline"><a>ABC</a></span></p>
        <ul>
          <li>
            <p><span style="color:#ff3300"><span style="TEXT-DECORATION:underline"><a>ABC</a></span></span></p>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>1231</li>
</ul>

<ul><ul></ul></ul>


<strong a="1" b="2">a</strong>

<h1>a</h1>
<h2>q</h2>
<h3>w</h3>

<em>em</em>
</html>
</doc>

结果:

<?xml version="1.0" encoding="utf-8"?>
<jpxml>


    <table a="b" />
    <table a="b" />
    <table width="100px&#10;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;"
        a="b" />
    <table width="100px&#10;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;">
        <th align="10" a="a">
            <td bgcolor="red" align="20" a="b">1</td>
        </th>
    </table>
    <u>
        <a>ABC</a>
    </u>
    <u>
        <a>ABC</a>
    </u>
    <u a="b">
        <a>ABC</a>
    </u>
    <red>dfafadssfas</red>
    <blue>dfafadssfas </blue>
    <span>
        <a>EFG</a>
    </span>
    <red>dfafadssfas </red>
    <blue>dfafadssfas </blue>
    <p>dfafadssfas </p>

    <ul1>
        <li1>
            <p>1</p>
            <ul2>
                <li2>
                    <p>
                        <u>
                            <a>ABC</a>
                        </u>
                    </p>
                    <ul3>
                        <li3>
                            <p>
                                <red>
                                    <u>
                                        <a>ABC</a>
                                    </u>
                                </red>
                            </p>
                        </li3>
                    </ul3>
                </li2>
            </ul2>
        </li1>
        <li1>1231</li1>
    </ul1>

    <ul1>
        <ul2 />
    </ul1>


    <b a="1" b="2">a</b>

    <h1>a</h1>
    <h2>q</h2>
    <h3>w</h3>

    <i>em</i>

</jpxml>



XSL文件内容:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" version="1.0" encoding="utf-8"
		indent="yes" cdata-section-elements="DataContent " />
	
	<xsl:template match="/">
		<jpxml>
			<xsl:apply-templates />
		</jpxml>
	</xsl:template>
	
<!-- 	ul,ol的转换 -->
	<xsl:template match="ul|ol">
		<xsl:choose>
			<xsl:when test="number(count(ancestor::ul)) > 0">
				<xsl:element name="{concat('ul',number(count(ancestor-or-self::ul)))}">
					<xsl:for-each select="@*">
						<xsl:copy/>
					</xsl:for-each>
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:when>
			<xsl:otherwise>
				<xsl:element name="ul1">
					<xsl:for-each select="@*">
						<xsl:copy/>
					</xsl:for-each>
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

<!-- 	li的转换 -->
	<xsl:template match="li">
		<xsl:choose>
			<xsl:when test="number(count(ancestor::li)) > 0">
				<xsl:element name="{concat('li',number(count(ancestor-or-self::li)))}">
					<xsl:for-each select="@*">
						<xsl:copy/>
					</xsl:for-each>
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:when>
			<xsl:otherwise>
				<xsl:element name="li1">
					<xsl:for-each select="@*">
						<xsl:copy/>
					</xsl:for-each>
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	
	
<!-- 	表格处理:style含有WIDTH的变成width属性,删除style属性 -->
					
	<xsl:template match="table">
		<xsl:element name="{name(.)}">
			<xsl:choose>
				<!-- 判断当前table是否含有style属性值WIDTH -->
				<xsl:when test="contains(@style,'WIDTH')">
					<xsl:for-each select="@*">
						<!-- 判断当前属性是否是style -->
						<xsl:choose>
							<!-- 当前属性是style -->
							<xsl:when test="name(.) = 'style'">
									<xsl:attribute name="width">
										<!--判断width的属性值是否有px -->
										<xsl:choose>
											<xsl:when test="contains(substring-before(substring-after(string(.),'WIDTH:'),';'),'px')"> 
												<xsl:value-of select="number(substring-before(substring-after(string(.),'WIDTH:'),'px;'))"/>px
			 								</xsl:when>
			 								<xsl:when test="contains(substring-before(substring-after(string(.),'WIDTH:'),';'),'PX')"> 
			 									<xsl:value-of select="number(substring-before(substring-after(string(.),'WIDTH:'),'PX;'))"/>px
			 								</xsl:when>
											<!-- WITDTH值没有px -->
											<xsl:otherwise>
												<xsl:value-of select="number(substring-before(substring-after(string(.),'WIDTH:'),';'))"/>
											</xsl:otherwise>
										</xsl:choose>
									</xsl:attribute>
							</xsl:when>
							<xsl:otherwise>
								<!-- 当前属性不是style -->
								<xsl:attribute name="{name(.)}">
									<xsl:value-of select="."/>
								</xsl:attribute>
							</xsl:otherwise>
						</xsl:choose>
					</xsl:for-each>
				</xsl:when>
				<xsl:otherwise>
					<xsl:for-each select="@*">
						<xsl:if test="name(.) != 'style'">
							<xsl:attribute name="{name(.)}">
								<xsl:value-of select="."/>
							</xsl:attribute>
						</xsl:if>
					</xsl:for-each>
				</xsl:otherwise>
			</xsl:choose>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>
	
<!-- 	td处理:将TEXT-ALIGN属性改为align,BACKGROUND-COLOR改为bgcolor,属性值不变 -->
	<xsl:template match="td">
		<xsl:element name="{name(.)}">
			<xsl:for-each select="@*">
				<xsl:choose>
					<xsl:when test="name(.) = 'TEXT-ALIGN'">
						<xsl:attribute name="align">
							<xsl:value-of select="."/>
						</xsl:attribute>	
					</xsl:when>
					<xsl:when test="name(.) = 'BACKGROUND-COLOR'">
						<xsl:attribute name="bgcolor">
							<xsl:value-of select="."/>
						</xsl:attribute>	
					</xsl:when>
					<xsl:otherwise>
						<xsl:copy/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:for-each>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>
		
<!-- 	th处理:将TEXT-ALIGN属性改为align,属性值不变 -->
	<xsl:template match="th">
		<xsl:element name="{name(.)}">
			<xsl:for-each select="@*">
				<xsl:choose>
					<xsl:when test="name(.) = 'TEXT-ALIGN'">
						<xsl:attribute name="align">
							<xsl:value-of select="."/>
						</xsl:attribute>	
					</xsl:when>
					<xsl:otherwise>
						<xsl:copy/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:for-each>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>
	
<!-- 	<span style="TEXT-DECORATION:underline">ABC</span> -->
<!-- <span style="COLOR:#ff3300">dfafadssfas </span>  -->
<!-- span标签下划线和两种颜色的转换和去除span标签中的属性和值 -->

	<xsl:template match="span">
		<xsl:choose>
			<xsl:when test="@style = 'TEXT-DECORATION:underline' or @style = 'text-decoration:underline'">
				<xsl:element name="u">
					<xsl:for-each select="@*">
						<xsl:if test="name(.) != 'style'">
							<xsl:attribute name="{name(.)}">
								<xsl:value-of select="."/>
							</xsl:attribute>
						</xsl:if>
					</xsl:for-each>
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:when>
			<xsl:when test="@style = 'COLOR:#ff3300' or @style = 'color:#ff3300'">
				<xsl:element name="red">
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:when>
			<xsl:when test="@style = 'COLOR:#0033ff' or @style = 'color:#0033ff'">
				<xsl:element name="blue">
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:when>
			<xsl:otherwise>
				<xsl:element name="{name(.)}">
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	
<!-- <p style="COLOR:#ff3300">dfafadssfas </p> -->
<!-- p标签两种颜色和删除属性和值的转换 -->
	<xsl:template match="p">
		<xsl:choose>
			<xsl:when test="@style = 'COLOR:#ff3300' or @style = 'color:#ff3300'">
				<xsl:element name="red">
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:when>
			<xsl:when test="@style = 'COLOR:#0033ff' or @style = 'color:#0033ff'">
				<xsl:element name="blue">
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:when>
			<xsl:otherwise>
				<xsl:element name="{name(.)}">
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:otherwise>
		</xsl:choose>
	
	</xsl:template>


	<xsl:template match="a">
		<xsl:element name="{name(.)}">
			<xsl:for-each select="@*">
				<xsl:copy />
			</xsl:for-each>
			<xsl:apply-templates />
		</xsl:element>

	</xsl:template>

	<xsl:template name="strong" match="strong">
		<xsl:element name="b">
			<xsl:for-each select="@*">
				<xsl:copy />
			</xsl:for-each>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>
	
	<xsl:template match="em">
		<xsl:element name="i">
			<xsl:for-each select="@*">
				<xsl:copy />
			</xsl:for-each>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>

	<xsl:template match="h1|h2|h3">
		<xsl:element name="{name(.)}">
			<xsl:for-each select="@*">
				<xsl:copy/>
			</xsl:for-each>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>

</xsl:stylesheet>

Java代码:

public static void main(String argv[]){
		String src = "E:\\workspace2\\test1\\WebContent\\test2\\a.xml";
		String dest = "E:\\workspace2\\test1\\WebContent\\test2\\a1.xml";
		String xslt = "E:\\workspace2\\test1\\WebContent\\test2\\a.xsl";
//		String dest = "E:\\workspace2\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\test1\\WEB-INF\\results\\a2.xml";
//		String xslt = "E:\\workspace2\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\test1\\WEB-INF\\templates\\a.xsl";

		File src2 = new File(src);
		File dest2 = new File(dest);
		File xslt2 = new File (xslt);

		Source srcSource = new StreamSource(src2);
		Result destResult = new StreamResult(dest2);
		Source xsltSource = new StreamSource(xslt2);

		try{
			TransformerFactory transFact = TransformerFactory.newInstance();
			Transformer trans = transFact.newTransformer(xsltSource);
			trans.transform(srcSource,destResult);
		}catch(TransformerConfigurationException e){
			e.printStackTrace();
		}catch(TransformerFactoryConfigurationError e){
			e.printStackTrace();
		}catch(TransformerException e){
			e.printStackTrace();
		}
	}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值