下面是根據它們的層次嵌套節點的簡單方法:
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="/XML_FILTER">
<ul>
<xsl:apply-templates select="XPATH[not(contains(@xpath, '/'))]"/>
</ul>
</xsl:template>
<xsl:template match="XPATH">
<xsl:variable name="dir" select="concat(@xpath, '/')" />
<li>
<xsl:value-of select="@xpath"/>
</li>
<xsl:variable name="child" select="../XPATH[starts-with(@xpath, $dir) and not(contains(substring-after(@xpath, $dir), '/'))]" />
<xsl:if test="$child">
<ul>
<xsl:apply-templates select="$child"/>
</ul>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
適用於您的示例輸入(從屬性的名字移除非法@
字符後! ),結果將爲:
<?xml version="1.0" encoding="UTF-8"?>
<ul>
<li>root</li>
<ul>
<li>root/1stGenChild1</li>
<ul>
<li>root/1stGenChild1/2ndGenChild1</li>
<li>root/1stGenChild1/2ndGenChild2</li>
</ul>
<li>root/1stGenChild2</li>
</ul>
</ul>
現在您只需要替換:
一起返回的最後一個令牌的命名模板調用
<xsl:value-of select="@xpath"/>
指令 - 參見:https://stackoverflow.com/a/41625340/3016153
還是這樣做,而不是:
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="/XML_FILTER">
<ul>
<xsl:apply-templates select="XPATH[not(contains(@xpath, '/'))]"/>
</ul>
</xsl:template>
<xsl:template match="XPATH">
<xsl:param name="parent"/>
<xsl:variable name="dir" select="concat(@xpath, '/')" />
<li>
<xsl:value-of select="substring-after(concat('/', @xpath), concat($parent, '/'))"/>
</li>
<xsl:variable name="child" select="../XPATH[starts-with(@xpath, $dir) and not(contains(substring-after(@xpath, $dir), '/'))]" />
<xsl:if test="$child">
<ul>
<xsl:apply-templates select="$child">
<xsl:with-param name="parent" select="concat('/', @xpath)"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
「*這樣做不能與屬性數據之中,而不是在元素的內部處理的正常方法。*」這有什麼區別?你指的是什麼「常規方法」? –
經過反思,我認爲我的情況不同在於我的數據中的第一個xpath不是根,它是第一個孩子。我仍然希望得到相同的輸出,並且擁有它自己的水平。我已經調整了相應的問題。 –
提前知道根元素的名稱嗎? –