-1

作为一个 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> 

谢谢你的帮助

4

1 回答 1

1

这行得通(我用 tr 和 td 元素构建了一个表,但我假设你可以从这里增强)。有关以下兄弟姐妹的有用链接

   <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>
于 2013-05-11T19:27:10.170 回答