java - 创建树的 XSL 问题

标签 java xml xslt

我有 XML 文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<childrens>
  <child entity_id="1" value="Root Catalog" parent_id="0">
    <child entity_id="2" value="Apparel" parent_id="1">
      <child entity_id="4" value="Shirts" parent_id="2"/>
      <child entity_id="5" value="Pants" parent_id="2"/>
    </child>
    <child entity_id="3" value="Accessories" parent_id="1">
      <child entity_id="6" value="Handbags" parent_id="3"/>
      <child entity_id="7" value="Jewelry" parent_id="3"/>
    </child>
     .
     .
     .
    <child entity_id='1110' value="test" parent_is="1109">
       <child entity_id='1111' value="test0" parent_is="1110">
           <child entity_id="1005" value="test1" parent_is="1111"/>
           <child entity_id="1006" value="test12" parent_is="1111"/>
           <child entity_id="1007" value="test123" parent_is="1111"/>
        <child>
    </child>
  <child >
</childrens>

现在我已经编写了这个 XSL 代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
  <xsl:param name="selected" />

  <xsl:template match="/*">
    <xsl:apply-templates select="*[not($selected)] | //*[@entity_id = $selected]/*" />
  </xsl:template>

  <xsl:template match="*">
    <span onclick="displayResult('{@entity_id}');">
      <xsl:value-of select="concat(@value, '&#xA0;')"/><br/>
    </span>
  </xsl:template>
</xsl:stylesheet>

HTML 是

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Region</title>
    <link href='style.css' rel='stylesheet' type='text/css'/>
    <script>
        var xml = loadXMLDoc("tree.xml");
        var xsl = loadXMLDoc("try.xsl");

        function loadXMLDocActiveX(location) {
            var doc = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
            doc.async = false;
            doc.load(location);
            return doc;
        }

        function loadXMLDocOther(location) {
            xhttp = new XMLHttpRequest();
            xhttp.open("GET", location, false);
            xhttp.send("");
            return xhttp.responseXML;
        }

        function loadXMLDoc(dname) {
            if (window.ActiveXObject) {
                return loadXMLDocActiveX(dname);
            }
            else if (window.XMLHttpRequest) {
                return loadXMLDocOther(dname);
            }
        }

        function transformActiveX(xml, xsl, target, selected) {
            var transform = new ActiveXObject("MSXML2.XSLTemplate");
            transform.stylesheet = xsl;
            var processor = transform.createProcessor();
            processor.input = xml;

            if (selected) {
                processor.addParameter("selected", selected);
            }

            processor.transform();
            target.innerHTML = processor.output;
        }

        function transformOther(xml, xsl, target, selected) {
            var xsltProcessor = new XSLTProcessor();
            xsltProcessor.importStylesheet(xsl);

            if (selected) {
                xsltProcessor.setParameter(null, "selected", selected);
            }

            var resultDocument = xsltProcessor.transformToFragment(xml, document);
            target.innerHTML = "";
            target.appendChild(resultDocument);
        }

        function displayResult(selected) {
            var targetElement = document.getElementById("load");

            // code for IE
            if (window.ActiveXObject) {
                transformActiveX(xml, xsl, targetElement, selected);
            }
            // code for Mozilla, Firefox, Opera, etc.
            else if (document.implementation && 
                     document.implementation.createDocument) {
                transformOther(xml, xsl, targetElement, selected);
            }
        }
    </script>
</head>
<body onload="displayResult()">
    <div id="load">
    </div>
</body>
</html>

我正在使用此代码来制作树,现在我想要其中的 xsl

1) 我想从特定节点开始,例如这里测试,其中entity_id=1110

2) 叶子元素有一个类似 child 的类,例如,在 value = test 并且 value 的元素的情况下,叶子元素是 test1, test12, test123 =测试0

最佳答案

这个怎么样:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
  <xsl:param name="defaultValue" select="'test'" />
  <xsl:param name="selected" select="//*[@value = $defaultValue]/@entity_id" />

  <xsl:template match="/*">
    <xsl:apply-templates select="*[not($selected)] | //*[@entity_id = $selected]/*" />
  </xsl:template>

  <xsl:template match="*">
    <span onclick="displayResult('{@entity_id}');">
      <xsl:if test="not(*)">
         <xsl:attribute name="class">leaf</xsl:attribute>
      </xsl:if>
      <xsl:value-of select="concat(@value, '&#xA0;')"/><br/>
    </span>
  </xsl:template>
</xsl:stylesheet>

如果将 select 属性添加到 xsl:param,则可以指示要用作的项目的 entity_id默认起始项。

第二个模板中的 xsl:if 会将 class="leaf" 属性添加到叶节点。

关于java - 创建树的 XSL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14850499/

相关文章:

java - 无法使用 ClassPathXmlApplicationContext 加载我的配置文件,

java - 如何在实体中添加对象列表

java - 当我的类和文本文件位于可执行 JAR 中时,如何编写代码来访问文本文件?

java - 从 Hibernate Annotations 切换到 hbm.xml 文件时出错

javascript - 使用多个 XSL 文件转换 XML

java - 用未知参数替换数组的值

PHP SimpleXML - 一行解决查找一键;在 XML 文件中找到其父级?

java - 无法解析 android studio 中的符号 R

xml - BaseX 8.2 中带有元素节点测试的 XQuery 文档节点测试会在根元素之前出现注释时抛出异常。为什么?

XSLT 自定义排序