Xslt 组父/子

发布于 2024-11-04 05:47:46 字数 1044 浏览 0 评论 0原文

我在从 xml/xslt 转换中获取以下结果时遇到问题:

<root>
  <node>   
    <id>1</id>
    <parentid></parentid>
    <name>file 1</name>
  <node>
  <node>   
    <id>2</id>
    <parentid></parentid>
    <name>file 2</name>
  <node>
  <node>   
    <id>3</id>
    <parentid>2</parentid>
    <name>file 3</name>
  <node>
  <node>   
    <id>4</id>
    <parentid></parentid>
    <name>file 4</name>
  <node>
  <node>   
    <id>5</id>
    <parentid>2</parentid>
    <name>file 5</name>
  <node>
</root>

我希望输出 html 类似于:

 <ul>
    <li>file 1</li>
    <li>file 2</li>
       <ul>
          <li>file 3</li>
          <li>file 5</li>
       </ul>
    <li>file 4</li>
 </ul>

I have a trouble getting the following result from a xml/xslt transformation:

<root>
  <node>   
    <id>1</id>
    <parentid></parentid>
    <name>file 1</name>
  <node>
  <node>   
    <id>2</id>
    <parentid></parentid>
    <name>file 2</name>
  <node>
  <node>   
    <id>3</id>
    <parentid>2</parentid>
    <name>file 3</name>
  <node>
  <node>   
    <id>4</id>
    <parentid></parentid>
    <name>file 4</name>
  <node>
  <node>   
    <id>5</id>
    <parentid>2</parentid>
    <name>file 5</name>
  <node>
</root>

i would like the output html to be something like:

 <ul>
    <li>file 1</li>
    <li>file 2</li>
       <ul>
          <li>file 3</li>
          <li>file 5</li>
       </ul>
    <li>file 4</li>
 </ul>

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

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

发布评论

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

评论(2

゛清羽墨安 2024-11-11 05:47:46
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:strip-space elements="*"/>

    <xsl:template match="/root">
        <ul>
            <xsl:apply-templates select="node[string-length(parentid)=0]" />
        </ul>
    </xsl:template>

    <xsl:template match="node">
        <li>
            <xsl:value-of select="name"/>
        </li>
        <xsl:variable name="children" select="parent::*/node[parentid=current()/id]" />
        <xsl:if test="$children">
            <ul>
                <xsl:apply-templates select="$children" />
            </ul>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:strip-space elements="*"/>

    <xsl:template match="/root">
        <ul>
            <xsl:apply-templates select="node[string-length(parentid)=0]" />
        </ul>
    </xsl:template>

    <xsl:template match="node">
        <li>
            <xsl:value-of select="name"/>
        </li>
        <xsl:variable name="children" select="parent::*/node[parentid=current()/id]" />
        <xsl:if test="$children">
            <ul>
                <xsl:apply-templates select="$children" />
            </ul>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>
挽手叙旧 2024-11-11 05:47:46

关键(没有双关语)是使用 来设置父子关系。一旦定义好了,剩下的就很容易了。

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:key name="getchildren" match="node" use="parentid"/>

    <xsl:template match="root">
        <ul>
            <xsl:apply-templates
              select="node[parentid[not(normalize-space())]]"/>
        </ul>
    </xsl:template>

    <xsl:template match="node">
        <li><xsl:value-of select="name"/></li>
        <xsl:variable name="children" select="key( 'getchildren', id )"/>
        <xsl:if test="$children">
            <ul><xsl:apply-templates select="$children"/></ul>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

The key (no pun intended) is to use an <xsl:key> to set up the parent-child relationship. Once that is defined, the rest is easy.

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:key name="getchildren" match="node" use="parentid"/>

    <xsl:template match="root">
        <ul>
            <xsl:apply-templates
              select="node[parentid[not(normalize-space())]]"/>
        </ul>
    </xsl:template>

    <xsl:template match="node">
        <li><xsl:value-of select="name"/></li>
        <xsl:variable name="children" select="key( 'getchildren', id )"/>
        <xsl:if test="$children">
            <ul><xsl:apply-templates select="$children"/></ul>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文