Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT1:首先从最深的节点开始,将XML节点转换为Html列表_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

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

XSLT1:首先从最深的节点开始,将XML节点转换为Html列表,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我有下面的xml <root> <s> <name>self-1</name> <parents> <s> <name>p-1-2</name> <parents>

我有下面的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>

自我1
p-1-2
p-1-2-1
p-1-2-1-1
p-1-2-2
我需要编写一个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>
  • p-1-2-1-1
    • p-1-2-1
    • p-1-2-2
      • p-1-2
        • 自我1

以下是我对如何解决这一问题的建议:

<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>
    
    • p-1-2-1-1
      • p-1-2-1
      • p-1-2-2
        • p-1-2
          • 自我1

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

    处理多个节点

    我将模板
    更新为如下内容:

     <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>
    
    
    

    非常感谢Martin,我完全忘记了我可以使用后代轴