【发布时间】:2016-08-08 10:08:02
【问题描述】:
我刚开始接触 xslt,我正在做一些小任务来熟悉 xslt。但我遇到了一个无法解决的问题,无法将 xml 文件转换为另一个文件。
场景:
输入是一个包含节点的xml文件,每一个都是一对父子标签,标签用标签表示当前节点的名字,用标签
<TypedPolling xmlns="http://schemas.microsoft.com/Sql/2008/05/TypedPolling">
<TypedPolling0>
<TypedPolling0>
<son>1</son>
<father>0</father>
</TypedPolling0>
<TypedPolling0>
<son>2</son>
<father>1</father>
</TypedPolling0>
<TypedPolling0>
<son>3</son>
<father>0</father>
</TypedPolling0>
<TypedPolling0>
<son>4</son>
<father>3</father>
</TypedPolling0>
</TypedPolling0>
</TypedPolling>
之前的xml文件应该转换成这个xml文件:
<ns0:TreeNode>
<ns0:node>0</ns0:node>
<ns0:LevelInTree>1</ns0:LevelInTree>
<ns0:TreeNode>
<ns0:node>1</ns0:node>
<ns0:LevelInTree>2</ns0:LevelInTree>
<ns0:TreeNode>
<ns0:node>2</ns0:node>
<ns0:LevelInTree>3</ns0:LevelInTree>
</ns0:TreeNode>
</ns0:TreeNode>
<ns0:TreeNode>
<ns0:node>3</ns0:node>
<ns0:LevelInTree>2</ns0:LevelInTree>
<TreeNode>
<ns0:node>4</ns0:node>
<ns0:LevelInTree>3</ns0:LevelInTree>
</TreeNode>
</TreeNode>
</TreeNode>
我为转换输入而编写的代码是(我使用 key 元素来获取具有指定父亲姓名的儿子):
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
xmlns:s0="http://schemas.microsoft.com/Sql/2008/05/TypedPolling"
xmlns:ns0="http://NO.Aditro.Schemas.Organization.OrganizationTrees"
xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp"
exclude-result-prefixes="msxsl var s0 userCSharp">
<xsl:output omit-xml-declaration="yes" method="xml" indent="yes" version="1.0" />
<xsl:key name="KeyItemFather" match="/s0:TypedPolling/s0:TypedPolling0/s0:TypedPolling0" use="@father" />
<xsl:template match="/">
<xsl:variable name="son" select="0" />
<xsl:variable name="level" select="1" />
<xsl:apply-templates mode="NewNode" select="/s0:TypedPolling/s0:TypedPolling0">
<xsl:with-param name="level" select="$level" />
</xsl:apply-templates>
</xsl:template>
<xsl:template name="NewTreeNode" match="/s0:TypedPolling/s0:TypedPolling0/s0:TypedPolling0" mode="NewNode">
<xsl:param name="son" />
<xsl:param name="level" />
<ns0:TreeNode>
<ns0:node>
<xsl:value-of select="$son" />
</ns0:node>
<ns0:LevelInTree>
<xsl:value-of select="$level" />
</ns0:LevelInTree>
<xsl:apply-templates select="key('KeyItemFather', $son)" mode="NewNode">
<xsl:with-param name="level" select="$level+1" />
</xsl:apply-templates>
</ns0:TreeNode>
</xsl:template>
</xsl:stylesheet>
我遇到的问题是在递归过程中发生了一些错误,即递归不断进行并且<ns0:node></ns0:node> 保持为空(例如应该是<ns0:node>3</ns0:node>)。我找不到我的错误在哪里! :(
【问题讨论】:
-
欢迎来到 SO!请edit您的问题并添加有关您遇到的确切问题的信息 - 您是否收到错误消息?如果是,什么错误信息?您得到的输出是否与预期输出不同?如果是,怎么做?
-
请解释所需转换的逻辑。 -- 另请注意,您向我们展示的输出有一个未定义的前缀。
-
@michael.hor257k 根据我从你的问题中了解到,我所做的转换就是要转换一个xml文件,它的节点包含
到节点树,每个节点都有一个级别,表示它与第一个节点的距离。如果我的问题不正确,请纠正我! -
重要的是我正确地理解了你的问题。在这一点上,我不知道你想做什么。请编辑您的问题并解释如果我手动执行此操作,我将如何准确地到达显示的输出。