移动元素快捷方式



如何使用 xslt 转换将元素 shortdesc 定位在元素 h1 之后。 目前,我通过以下代码获取每个元素的内容。

<xsl:template match="shortdesc" mode="body">       
<shortdesc>
<xsl:apply-templates mode="body"/>
</shortdesc>
</xsl:template>
<xsl:template match="p" mode="body">       
<p>
<xsl:apply-templates mode="body"/>
</p>
</xsl:template>
<xsl:template match="h1" mode="body">      
<h1>
<xsl:apply-templates mode="body"/>
</h1>
</xsl:template>

源文件

<topic>    
<h1>text</h1>
<p>text</p>
<p>text</p>
<shortdesc>text</shortdesc>
<p>text</p>
<p>text</p>
</topic>

目标文件(转换后应如下所示(

<topic>
<h1>text</h1>
<shortdesc>text</shortdesc>
<p>text</p>
<p>text</p>
<p>text</p>
<p>text</p>
</topic>

谢谢你的想法

您可以使用以下方法做到这一点:

<xsl:template match="h1" mode="body">      
<h1>
<xsl:apply-templates mode="body"/>
</h1>
<xsl:apply-templates select="../shortdesc" mode="desc"/>
</xsl:template>
<xsl:template match="shortdesc" mode="body"/>
<xsl:template match="shortdesc" mode="desc">       
<shortdesc>
<xsl:apply-templates mode="body"/>
</shortdesc>
</xsl:template>

顺便说一句,你不想用这样的东西替换你的模板吗:

<xsl:template match="*" mode="body">
<xsl:element name="{name()}">
<xsl:apply-templates mode="body"/>
</xsl:element>
</xsl:template>

为了将示例简化为手头的问题,给定以下输入:

.XML

<topic>    
<h1>text</h1>
<p>text</p>
<p>text</p>
<shortdesc>text</shortdesc>
<p>text</p>
<p>text</p>
</topic>

以下样式表:

XSLT 1.0

<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"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/topic">       
<xsl:copy>
<xsl:apply-templates select="h1"/>
<xsl:apply-templates select="shortdesc"/>
<xsl:apply-templates select="p"/>
</xsl:copy>
</xsl:template>
<xsl:template match="h1 | shortdesc | p">      
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

将返回:

结果

<?xml version="1.0" encoding="UTF-8"?>
<topic>
<h1>text</h1>
<shortdesc>text</shortdesc>
<p>text</p>
<p>text</p>
<p>text</p>
<p>text</p>
</topic>

最新更新