1

您好我正在寻找一个用于生成 HTML 的 XSLT,如下所示。以下是转换的详细信息。请提供您的意见。

对于每个 PageGroup 我需要创建一个

In HTML an Li element should be populated.

    <li>
        <a>Test</a>
    </li>

And under each Pagegroup for every Page Ul should be populated.
<ul>
        <li>
            <a>Test Role 1</a>
        </li>
        <li>
            <a>Test Role 2</a>
        </li>
</ul>

XML:

<menuitems>
    <pagegroup title="Test">
        <pages id="1" url="Test1.aspx" description="Tes 1" type="1" role="Test Role 1"/>
        <pages id="2" url="Test2.aspx" description="Tes 2" type="1" role="Test Role 2"/>
        <pagegroup title="Projects">
            <pages id="4" url="Test 2 3.aspx" description="Test 2 3" type="1" role="Rol 3"/>
            <pages id="4" url="Test 2 5.aspx" description="Test 2 5" type="1" role="Rol 4"/>
        </pagegroup>
    </pagegroup>
</menuitems>

输出 HTML 期望

<ul>
    <li>
        <a>Test</a>
    </li>
    <ul>
        <li>
            <a>Test Role 1</a>
        </li>
        <li>
            <a>Test Role 2</a>
        </li>
        <ul>
            <li>
                <a>Projects</a>
            </li>
            <ul>
                <li>
                    <a>Test 2 3</a>
                </li>
                <li>
                    <a>Test 2 5</a>
                </li>
            </ul>
        </ul>
    </ul>
</ul>

XSLT 试过了

<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:template match="pagegroup">
                        <ul>
                                    <xsl:apply-templates select="pages"/>
                                    <li>
                                    <xsl:value-of select="@title"/>
                                    </li>
                        </ul>
            </xsl:template>
            <xsl:template match="pages">
                        <li>
                                    <xsl:value-of select="@role"/>
                                    <xsl:if test="pagegroup">
                                                <ul>
                                                            <xsl:apply-templates select="pages"/>
                                                            <li>
                                                            <xsl:value-of select="@title" />
                                                            </li>
                                                </ul>
                                    </xsl:if>
                        </li>
            </xsl:template>
</xsl:stylesheet>
4

2 回答 2

2

你离得太远了。主要问题是在您的模板中匹配页面组您正在这样做......

<xsl:apply-templates select="pages"/>

当你真的想要这样做时,匹配页面页面组

<xsl:apply-templates/>

尝试以下 XSLT

<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:template match="pagegroup">
      <ul>
         <li>
            <xsl:value-of select="@title"/>
         </li>
         <ul>
            <xsl:apply-templates/>
         </ul>
      </ul>
   </xsl:template>
   <xsl:template match="pages">
      <li>
         <xsl:value-of select="@role"/>
      </li>
   </xsl:template>
</xsl:stylesheet>

当应用于您的 XML 时,将输出以下内容

<ul>
   <li>Test</li>
   <ul>
      <li>Test Role 1</li>
      <li>Test Role 2</li>
      <ul>
         <li>Projects</li>
         <ul>
            <li>Rol 3</li>
            <li>Rol 4</li>
         </ul>
      </ul>
   </ul>
</ul>
于 2012-04-24T11:37:49.263 回答
1

你对你想要的东西有点出乎我的意料。

这越来越接近,但你仍然不会得到你想要的,因为在一组页面中你似乎想要角色,而在另一个描述中。这是可能的,但我不确定这是否是你想要的

    <?xml version="1.0" encoding="ISO-8859-1"?>

    <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:template match="pagegroup">
            <ul>
                <li>
                    <a><xsl:value-of select="@title"/></a>
                </li>
                <xsl:if test="pages | pagegroup">
                    <ul>
                        <xsl:apply-templates select="pages | pagegroup"/>
                    </ul>
                </xsl:if>

            </ul>
        </xsl:template>

        <xsl:template match="pages">
            <li>
                <a><xsl:value-of select="@role"/></a>
                <xsl:if test="pagegroup">
                    <ul>

                        <li>
                            <xsl:value-of select="@title" />
                        </li>
                    </ul>
                </xsl:if>
            </li>
        </xsl:template>
    </xsl:stylesheet>
于 2012-04-24T11:46:35.950 回答