這是不難XSLT 1.0做的,看我2004年的回答更具體的圖遍歷問題:
http://lists.xml.org/archives/xml-dev/200401/msg00444.html
下面是一個完整的XSLT 1.0有向圖遍歷解決方案,假設向鏈路特定的XML表示(如你忘了展現給我們的源XML文檔......):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kNodeById" match="*" use="@id"/>
<xsl:template match="/">
<xsl:call-template name="gTraverse">
<xsl:with-param name="pNode" select="/*/a"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="gTraverse">
<xsl:param name="pNode"/>
<xsl:param name="pVisited" select="/.."/>
<xsl:param name="pMustVisit" select="/.."/>
<xsl:variable name="vnewVisited" select=
"$pVisited | $pNode"/>
<xsl:variable name="vnewNodes" select=
"key('kNodeById',
($pNode/linkTo
|
/*/*[linkTo=$pNode/@id])/@id
)
[not(@id = $vnewVisited/@id)]
"/>
<xsl:variable name="vnewMustVisit" select=
"$pMustVisit[count(.|$pNode) > 1] | $vnewNodes"/>
<xsl:choose>
<xsl:when test="not($vnewMustVisit)">
<xsl:copy-of select="$vnewVisited"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="gTraverse">
<xsl:with-param name="pNode" select=
"$vnewMustVisit[1]"/>
<xsl:with-param name="pVisited" select="$vnewVisited"/>
<xsl:with-param name="pMustVisit" select=
"$vnewMustVisit[position() > 1]"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
當施加於下面的XML文檔這種轉變,表示有5個頂點向圖:
<graph>
<a id ="1">
<linkTo>2</linkTo>
<linkTo>5</linkTo>
</a>
<b id ="2">
<linkTo>3</linkTo>
<linkTo>5</linkTo>
</b>
<c id ="3">
<linkTo>1</linkTo>
<linkTo>4</linkTo>
</c>
<d id ="4">
<linkTo>1</linkTo>
</d>
<e id ="5">
<linkTo>3</linkTo>
<linkTo>4</linkTo>
</e>
<f id ="6">
<linkTo>1</linkTo>
</f>
</graph>
正確的結果(曲線圖的所有節點),產生:
<a id="1">
<linkTo>2</linkTo>
<linkTo>5</linkTo>
</a>
<b id="2">
<linkTo>3</linkTo>
<linkTo>5</linkTo>
</b>
<c id="3">
<linkTo>1</linkTo>
<linkTo>4</linkTo>
</c>
<d id="4">
<linkTo>1</linkTo>
</d>
<e id="5">
<linkTo>3</linkTo>
<linkTo>4</linkTo>
</e>
<f id="6">
<linkTo>1</linkTo>
</f>
你可以更具體地瞭解你的輸入看起來如何?爲什麼不能將已遍歷的元素存儲在參數中,如http://lists.xml.org/archives/xml-dev/201110/msg00030.html中所做的那樣? –
XSLT是一種聲明性語言,而不是程序性語言。因此沒有「早期」或「已經」或其他時間相關概念的概念。你需要重新思考這個過程的功能性。 –
樣本輸入,所需的輸出以及樣式表的嘗試都會讓您更容易地向您展示適用於您的情況的解決方案。 – LarsH