我新引入xslt,我正在做一些小任務來熟悉xslt。但我陷入了一個問題,我無法解決將xml文件轉換爲另一個問題。 場景: 輸入是一個xml文件,包含節點,每一個都是一對子和父標記,它們通過標記指示當前節點的名稱,父節點的名稱由標記< father>。 我想要做的是生成一個節點樹,第一個節點是沒有父親的節點(我在樹1中手動創建了名稱爲0和級別的節點),然後查找具有父標籤的所有節點(0)作爲第一步,我會得到我的輸入文件(1和4),在這裏我創建一個新的節點到節點(0)持有名稱(1),並在樹中有一個級別等於( 2)然後我會去查找父標籤等於(1)等的所有節點,當我到達沒有更多孩子的地方(1)時,我將創建另一個名爲(4)的節點)並且與名稱爲(1)的節點在樹中具有相同的級別,然後繼續查找父標籤等於(4)等等的節點。 我有這樣的XML:遞歸和TreeNode xslt
<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>
我寫來轉換輸入的代碼是(我用的關鍵要素,以獲得誰擁有指定的父親名字的兒子):
<?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!請[編輯]您的問題,並添加關於您正在使用的*精確*問題的信息 - 您是否收到錯誤消息?如果是,什麼錯誤信息?你得到的輸出是否與預期的輸出不同?如果是,如何? –
請解釋所需轉換的邏輯。 - 還要注意你給我們的輸出有一個未定義的前綴。 –
@ michael.hor257k根據我從你的問題中瞭解到的情況,我所做的轉換全部都是將一個xml文件轉換成節點樹,其中節點包含節點 < father >並且每個節點都有一個級別表示它有多遠來自第一個節點。請糾正我,如果我不正確地得到你的問題! –