[英]xslt recursive child nodes with parent node
我想知道在xslt 2.0中解决此解决方案的更好方法。
输入:
<Root>
<Record>
<FName>Abc</FName>
<MName>FAbc</MName>
<Kid>
<CName>C1Abc<CName>
</Kid>
<Kid>
<CName>C2Abc<CName>
</Kid>
</Record>
<Record>
<FName>Def</FName>
<MName>FDef</MName>
<Kid>
<CName>C1Def<CName>
</Kid>
</Record>
<Record>
<FName>Xyz</FName>
<MName>FXyz</MName>
</Record>
</Root>
输出:
<Root>
<Record>
<FName>Abc</FName>
<MName>FAbc</MName>
<CName>C1Abc<CName>
</Record>
<Record>
<FName>Abc</FName>
<MName>FAbc</MName>
<CName>C2Abc<CName>
</Record>
<Record>
<FName>Def</FName>
<MName>FDef</MName>
<CName>C1Def<CName>
</Record>
<Record>
<FName>Xyz</FName>
<MName>FXyz</MName>
<CName></CName>
</Record>
</Root>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0">
<xsl:template match="Root">
<Root>
<xsl:apply-templates select="Record">
</xsl:apply-templates>
</Root>
</xsl:template>
<xsl:template match="Record">
<xsl:choose>
<xsl:when test="Kid">
<xsl:apply-templates select="Kid">
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<Record>
<FName>
<xsl:value-of select="FName"/>
</FName>
<MName>
<xsl:value-of select="MName"/>
</MName>
<CName>
<xsl:value-of select="Kid/CName"/>
</CName>
</Record>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="Kid">
<Record>
<FName>
<xsl:value-of select="../FName"/>
</FName>
<MName>
<xsl:value-of select="../MName"/>
</MName>
<CName>
<xsl:value-of select="CName"/>
</CName>
</Record>
</xsl:template>
</xsl:stylesheet>
我的xslt可以正常工作,并且能够获得期望的输出。 但我想听听是否还有其他更好的方法可以做到这一点。 主要是为了避免任何性能问题,因为将有成千上万条包含更多数据的记录。 谢谢。
你可以重写
<xsl:template match="Record">
<xsl:choose>
<xsl:when test="Kid">
<xsl:apply-templates select="Kid">
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<Record>
<FName>
<xsl:value-of select="FName"/>
</FName>
<MName>
<xsl:value-of select="MName"/>
</MName>
<CName>
<xsl:value-of select="Kid/CName"/>
</CName>
</Record>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
如
<xsl:template match="Record[not(Kid)]">
<Record>
<FName>
<xsl:value-of select="FName"/>
</FName>
<MName>
<xsl:value-of select="MName"/>
</MName>
<CName></CName>
</Record>
</xsl:template>
<xsl:template match="Record[Kid]">
<xsl:apply-templates select="Kid"/>
</xsl:template>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.