XSLT1:首先从最深的节点开始,将 XML 节点转换为 Html 列表

发布于 2024-11-07 04:45:38 字数 1368 浏览 1 评论 0原文

我有下面的 xml

 <root>
        <s>
            <name>self-1</name>
            <parents>
                <s>
                    <name>p-1-2</name>
                    <parents>
                        <s>
                            <name>p-1-2-1</name>
                            <parents>
                                <s>
                                    <name>p-1-2-1-1</name>
                                </s>
                            </parents>
                        </s>
                        <s>
                            <name>p-1-2-2</name>
                        </s>
                    </parents>
                </s>
            </parents>
        </s>
    </root>

,我需要编写一个 xslt1 来解析该 xml 以生成如下所示的输出,目标是首先处理所有父节点,最后处理节点 self-1。请给我一些建议。

<ul>
    <li>p-1-2-1-1</li>
    <ul>
        <li>p-1-2-1</li>
        <li>p-1-2-2</li>
        <ul>
            <li>p-1-2</li>
            <ul>
                <!-- self -->
                <li>self-1</li>
            </ul>
        </ul>
    </ul>
</ul>

I have this below xml

 <root>
        <s>
            <name>self-1</name>
            <parents>
                <s>
                    <name>p-1-2</name>
                    <parents>
                        <s>
                            <name>p-1-2-1</name>
                            <parents>
                                <s>
                                    <name>p-1-2-1-1</name>
                                </s>
                            </parents>
                        </s>
                        <s>
                            <name>p-1-2-2</name>
                        </s>
                    </parents>
                </s>
            </parents>
        </s>
    </root>

and I need to write an xslt1 to parse that xml to produce output like below, the goal is to process all parents nodes first and finally the node self-1. Please give me some advice.

<ul>
    <li>p-1-2-1-1</li>
    <ul>
        <li>p-1-2-1</li>
        <li>p-1-2-2</li>
        <ul>
            <li>p-1-2</li>
            <ul>
                <!-- self -->
                <li>self-1</li>
            </ul>
        </ul>
    </ul>
</ul>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

三月梨花 2024-11-14 04:45:38

这是我关于如何解决这个问题的建议:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="descendant::parents[not(s/parents)]"/>
  </xsl:template>

  <xsl:template match="parents | root">
    <ul>
      <xsl:apply-templates select="s/name"/>
      <xsl:variable name="p" select="parent::s/parent::parents | parent::s/parent::root"/>
      <xsl:if test="$p">
        <li>
          <xsl:apply-templates select="$p"/>
        </li>
      </xsl:if>
    </ul>
  </xsl:template>

  <xsl:template match="name">
    <li>
      <xsl:value-of select="."/>
    </li>
  </xsl:template>

</xsl:stylesheet>

输出

<ul>
   <li>p-1-2-1-1</li>
   <li>
      <ul>
         <li>p-1-2-1</li>
         <li>p-1-2-2</li>
         <li>
            <ul>
               <li>p-1-2</li>
               <li>
                  <ul>
                     <li>self-1</li>
                  </ul>
               </li>
            </ul>
         </li>
      </ul>
   </li>
</ul>

这并不完全是您所要求的,但这是故意这样做的:您的示例具有带有 ul 子元素的 ul 元素,但是HTML 中不允许这样做(http://www.w3.org/TR/html4/struct/lists.html#h-10.2)。因此,我的样式表通过确保任何 ul 仅具有 li 子元素来确保结果是有效的 HTML。

Here is my suggestion on how to solve that:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="descendant::parents[not(s/parents)]"/>
  </xsl:template>

  <xsl:template match="parents | root">
    <ul>
      <xsl:apply-templates select="s/name"/>
      <xsl:variable name="p" select="parent::s/parent::parents | parent::s/parent::root"/>
      <xsl:if test="$p">
        <li>
          <xsl:apply-templates select="$p"/>
        </li>
      </xsl:if>
    </ul>
  </xsl:template>

  <xsl:template match="name">
    <li>
      <xsl:value-of select="."/>
    </li>
  </xsl:template>

</xsl:stylesheet>

That outputs

<ul>
   <li>p-1-2-1-1</li>
   <li>
      <ul>
         <li>p-1-2-1</li>
         <li>p-1-2-2</li>
         <li>
            <ul>
               <li>p-1-2</li>
               <li>
                  <ul>
                     <li>self-1</li>
                  </ul>
               </li>
            </ul>
         </li>
      </ul>
   </li>
</ul>

That is not exactly what you asked for, but that is done intentionally: your sample had ul elements with ul children but that is not allowed in HTML(http://www.w3.org/TR/html4/struct/lists.html#h-10.2). So my stylesheet makes sure the result is valid HTML by making sure any ul has only li child elements.

诗笺 2024-11-14 04:45:38

为了处理多个节点

我将模板 更新为如下所示:

 <xsl:template match="parents | root">
        <ul>
            <xsl:apply-templates select="s/name"/>
            <xsl:choose>
                <xsl:when test="parent::s/parent::parents">
                    <xsl:variable name="p" select="parent::s/parent::parents"/>
                    <li><xsl:apply-templates select="$p"/></li>
                </xsl:when>

                <xsl:when test="parent::s/parent::root">
                    <xsl:variable name="p" select="parent::s/parent::root"/>
                    <li><xsl:apply-templates select="$p"/></li>
                </xsl:when>
            </xsl:choose>
        </ul>
    </xsl:template>

to handle multile node <s>

I updated the template <xsl:template match="parents | root"> to something like below:

 <xsl:template match="parents | root">
        <ul>
            <xsl:apply-templates select="s/name"/>
            <xsl:choose>
                <xsl:when test="parent::s/parent::parents">
                    <xsl:variable name="p" select="parent::s/parent::parents"/>
                    <li><xsl:apply-templates select="$p"/></li>
                </xsl:when>

                <xsl:when test="parent::s/parent::root">
                    <xsl:variable name="p" select="parent::s/parent::root"/>
                    <li><xsl:apply-templates select="$p"/></li>
                </xsl:when>
            </xsl:choose>
        </ul>
    </xsl:template>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文