使用XSLT从XML文件构建树?

时间:2013-05-11 18:18:36

标签: xslt tree

作为一个XML文件,我知道要通过XSL生成一些输出。但我需要构建一个导航树来隐藏我不必查看的内容或显示我想要的内容。我正在寻找的树应该像这样:

+VIEW1
+VIEW2

如果在某处遇到类似“+”的东西,例如在VIEW2上,我们应该像这样得到VIEW2的内容:

 +VIEW1
 -VIEW2
   yy NO
   aa YES
   zz NO
   tt NO

这是我的XML文件的一部分和我写的“view.xsl”。我还尝试从stackoverflow修改一些示例,但我没有找到如何获得正确的解决方案。

view.xsl

<xsl:stylesheet version="2.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" cdata-section-elements="Cdata" indent="yes"/>
<xsl:template match = "/">
<html >
<head>
<title Localizable_1="True"><xsl:value-of select="DOC/show"/></title>
</head>
<BODY class="BODY">
<H1><xsl:value-of select="DOC/show"/></H1>
<TABLE WIDTH="500px">
<xsl:for-each select="DOC/Entry">
<xsl:call-template name="RULE"/>
</xsl:for-each>
</TABLE>
</BODY>
</html>
</xsl:template>

<xsl:template name="RULE">  
<xsl:choose>
    <xsl:if test="level='ON'"><xsl:value-of select="light"/>YES</xsl:if>
    <xsl:if test="level='OFF'"><xsl:value-of select="light"/>NO</xsl:if>
</xsl:choose>

file.XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml:stylesheet type='text/xsl' href='view.xsl'?>
<DOC>
  <show>VIEW1</show>
  <Entry>
    <light>ae</light>
    <level>ON</level>
  </Entry>
  <Entry>
    <light>by</light>
    <level>OFF</level>
  </Entry>
  <Entry>
    <light>ac</light>
    <level>OFF</level>
  </Entry>

  <show>VIEW2</show>
  <Entry>
    <light>yy</light>
    <level>OFF</level>
  </Entry>
  <Entry>
    <light>aa</light>
    <level>ON</level>
  </Entry>
  <Entry>
    <light>zz</light>
    <level>OFF</level>
  </Entry>
  <Entry>
    <light>tt</light>
    <level>OFF</level>
  </Entry>
 </DOC> 

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

这可行(我用tr和td元素构建一个表,但我假设你可以从这里增强)。 following-sibling

上的有用链接
   <xsl:stylesheet version="2.0"
                xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/1999/xhtml" >

  <xsl:output method="html" cdata-section-elements="Cdata" indent="yes"/>
  <xsl:template match = "/">
    <html >
      <head>
        <title Localizable_1="True">
          <xsl:value-of select="DOC/show"/>
        </title>
        <script src="http://code.jquery.com/jquery-1.9.1.min.js" type="text/javascript">
          <xsl:comment>jq</xsl:comment>
        </script>
        <script src="https://raw.github.com/vakata/jstree/master/dist/jstree.min.js" type="text/javascript">
          <xsl:comment>tree</xsl:comment>
        </script>
      </head>
      <body class="BODY">
        <div class="tree">
        <xsl:apply-templates select="DOC/show" />
        </div>
        <script>
          $('div.tree')
          .jstree({
          core: {}
          })
          .bind("select_node.jstree", function (event, data) {
             alert(data.node.context.id); /*  do clever things here */
          })
          .delegate("a", "click", function (event, data) { event.preventDefault();  });
        </script>
      </body>
    </html>
  </xsl:template>

  <!-- match show elements -->
  <xsl:template match="show">
    <ul class="tree">
      <li>
        <a>
            <xsl:value-of select="."/>
        </a>
        <ul>
          <!-- only select the next Entry element -->
          <xsl:apply-templates select="following-sibling::*[1][self::Entry] "/>
        </ul>
      </li>
    </ul>
  </xsl:template>

  <xsl:template match="Entry">
    <li class="rule">
      <xsl:call-template name="RULE"/> 
    </li>
    <!-- only select the next Entry element -->
    <xsl:apply-templates select="following-sibling::*[1][self::Entry] "/>
  </xsl:template>

  <xsl:template name="RULE">
    <xsl:element name="a">
      <!-- or have a href here -->
      <xsl:attribute name="id">
        <xsl:value-of select="light"/>
      </xsl:attribute>
      <span class="light">
        <xsl:value-of select="light"/>
      </span>
      <span class="level">
      <xsl:choose>
        <xsl:when test="level='ON'">
          <xsl:text>YES</xsl:text>
        </xsl:when>
        <xsl:when test="level='OFF'">
          <xsl:text>NO</xsl:text>
        </xsl:when>
      </xsl:choose>
      </span>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>