通用XSLT转换代码

时间:2013-08-27 11:36:58

标签: html xml xslt

我在这里遇到了很多挑战......

是否可以使用适用于XML的任何层次结构的XSL代码,将其转换为嵌套的HTML列表?

示例XML:

<Base>
  <Parent>
    <Child />
    <Child>
      <ChildOne />
      <ChildOne>
       <ChildTwo />
       <ChildTwo />
      </ChildOne>
    </Child>
  </Parent>
  <Parent>
    <Child>
      <ChildOne>
        <ChildTwo>
          <ChildThree>
            <ChildFour />
          </ChildThree>
          <ChildThree/>
        </ChildTwo>
      </ChildOne>
      <ChildOne/>
      <ChildOne/>
    </Child>
    <Child/>
  </Parent>
</Base>

期望的结果:

<ul>
  <li>Parent1
    <ul>
      <li>Child</li>
      <li>Child
        <ul>
        <li>ChildOne</li>
        <li>ChildOne>
           <ul>
              <li>ChildTwo</li>
              <li>ChildTwo</li>
           </ul>
        </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Parent2
    <ul>
      <li>Child
        <ul>
            <li>ChildOne
                <ul>
                    <li>ChildTwo
                  <ul>
                  <li>ChildThree
                     <ul>
                         <li>ChildFour</li>
                     </ul>
                  </li>
                  <li>ChildThree</li>
                  </ul>
                </li>
            </ul>
            </li>
            <li>ChildOne</li>
            <li>ChildOne</li>
         </ul>
       </li>
       <li>Child</li>
    </ul>
  </li>
</ul>

所以逻辑是如果元素(上层)下面还有其他元素(被抑制的el。) - 被抑制的el。通过<li>name of upper el.<ul>all suppressed el.</ul></li>获取环绕等等。

我的观点是,这个XSL代码不是通过元素或属性的值或名称,而是通过条件检查,如果有其他元素属于特定元素。

F.e。,如果ChildThree本身没有ChildFour,则只有<li>ChildThree>而不是

<li>ChildThree
   <ul>
      <li>ChildFour</li>
   </ul>
</li>
希望我能清楚地解释清楚。 :)

P.S。这就是它必须在浏览器中查看的方式,或多或少(只是为了给出视觉表示,因为我们人类喜欢看东西。:P)

enter image description here

2 个答案:

答案 0 :(得分:3)

使用样式表

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

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

<xsl:template match="*[*]">
  <li>
    <xsl:value-of select="local-name()"/>
    <ul>
      <xsl:apply-templates/>
    </ul>
  </li>
</xsl:template>

<xsl:template match="*[not(*)]">
  <li>
    <xsl:value-of select="local-name()"/>
  </li>
</xsl:template>

<xsl:template match="/*" priority="5">
  <ul>
    <xsl:apply-templates/>
  </ul>
</xsl:template>

</xsl:stylesheet>

Saxon 6.5.5转换输入

<Base>
  <Parent>
    <Child />
    <Child>
      <ChildOne />
      <ChildOne>
       <ChildTwo />
       <ChildTwo />
      </ChildOne>
    </Child>
  </Parent>
  <Parent>
    <Child>
      <ChildOne>
        <ChildTwo>
          <ChildThree>
            <ChildFour />
          </ChildThree>
          <ChildThree/>
        </ChildTwo>
      </ChildOne>
      <ChildOne/>
      <ChildOne/>
    </Child>
    <Child/>
  </Parent>
</Base>

进入结果

<ul>

   <li>Parent
      <ul>

         <li>Child</li>

         <li>Child
            <ul>

               <li>ChildOne</li>

               <li>ChildOne
                  <ul>

                     <li>ChildTwo</li>

                     <li>ChildTwo</li>

                  </ul>
               </li>

            </ul>
         </li>

      </ul>
   </li>

   <li>Parent
      <ul>

         <li>Child
            <ul>

               <li>ChildOne
                  <ul>

                     <li>ChildTwo
                        <ul>

                           <li>ChildThree
                              <ul>

                                 <li>ChildFour</li>

                              </ul>
                           </li>

                           <li>ChildThree</li>

                        </ul>
                     </li>

                  </ul>
               </li>

               <li>ChildOne</li>

               <li>ChildOne</li>

            </ul>
         </li>

         <li>Child</li>

      </ul>
   </li>

</ul>

答案 1 :(得分:1)

这个XSL样式表让你想要完成。

<?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" omit-xml-declaration="yes"/>

  <!-- Match the Base element, with high priority to avoid matching the more
       specific template further down, that matches *[*] -->
  <xsl:template match="Base" priority="10">
    <ul>
      <xsl:apply-templates/>
    </ul>
  </xsl:template>

  <!-- Match the Parent element, with high priority to avoid matching the more
       specific template further down, that matches *[*] -->
  <xsl:template match="Parent" priority="10">
    <li>
      <!-- Output a Parent element and append it with its position amongst
           all Parent elements at this level. -->
      <xsl:text>Parent</xsl:text>
      <xsl:value-of select="count(preceding-sibling::Parent) + 1"/>
      <xsl:apply-templates/>
    </li>
  </xsl:template>

  <!-- Match those elements that have children. -->
  <xsl:template match="*[*]">
    <li>
      <xsl:value-of select="local-name(.)"/>
      <ul>
        <xsl:apply-templates/>
      </ul>
    </li>
  </xsl:template>

  <!-- Match the remaining elements (without children) -->
  <xsl:template match="*">
    <li>
      <xsl:value-of select="local-name(.)"/>
    </li>
  </xsl:template>
</xsl:stylesheet>

您可以在行动here中看到它。