簡體   English   中英

XSLT當源節點為同級並且嵌套基於屬性值時,將XML轉換為交叉引用的嵌套HTML列表

[英]XSLT Transforming XML into a cross referenced, nested HTML lists when source nodes are siblings and nesting is based on attribute values

問題:我需要從未嵌套的XML創建嵌套的HTML無序列表。 另外,我需要使用文檔中也包含的“允許的節點”部分來交叉引用XML。

XML示例:

<content>
  <data>
    <navigation>
      <link name="about us" url="#"/>
      <link name="staff" url="staff.asp" parent="about us"/>
      <link name="contact" url="contact.asp" parent="about us"/>
      <link name="facebook" url="facebook.asp"/>
    </navigation>
  </data>
  <allowedlinks>
    <link name="about us"/>       
    <link name="facebook"/>
  </allowedlinks>
</content>

結果HTML示例(請注意,我省略了樣板代碼):

<ul>
    <li>
      about us
      <ul>
        <li>staff</li>
        <li>contact</li>
      </ul>
    </li>
    <li>facebook</li>
</ul>

最終,這將在網站上形成一個導航菜單。

規則: -我需要使用XSLT 1.0創建解決方案。

-如果存在鏈接,則如果任何兄弟姐妹包含當前節點的@parent,則我需要將其添加到UL並創建任何嵌套的子UL。

-在生成沒有@parent的任何節點的LI項目之前,必須首先確認其@name與允許的鏈接部分中的鏈接@name匹配。

我認為-轉換的XML的結構確實很愚蠢,並且使轉換過程過於復雜-但是,由於我無法更改原始XML,因此我需要一個解決方案。

注意-我已經有了一個行之有效的答案,我會盡快發布。 我想先看看其他可能的答案:)

如果可以通過模板匹配來完成此操作,並且每次循環的操作次數都不太多,則可以加分。

我的解決方案包含2個我不喜歡的嵌套for-for。

這是使用的經典案例:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="allowed-link" match="allowedlinks/link" use="@name" />
<xsl:key name="link-by-parent" match="link" use="@parent" />

<xsl:template match="/content">
    <ul>
        <xsl:apply-templates select="data/navigation/link[not(@parent) and key('allowed-link', @name)]"/>
    </ul>
</xsl:template>

<xsl:template match="link">
    <li>
        <xsl:value-of select="@name"/>
        <xsl:variable name="sublinks" select="key('link-by-parent', @name)" />
        <xsl:if test="$sublinks">
            <ul>
                <xsl:apply-templates select="$sublinks"/>
            </ul>
        </xsl:if>
    </li>
</xsl:template>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM