Javascript 比另一个属性上的 XSLT generate-id() 更好地识别回调节点

标签 javascript xml xslt dom

在这个例子中,init() 能够使用传递给它的参数:

 <body onload="init(this);">

testdOnChange() 在这个例子中使用了更复杂的 XSLT generate-id() 技术:

  <testd:test
    testd_id="TESTD_ID_id0x03cc1988"
    testd_on_load="testdOnChange(testdGetElementById('TESTD_ID_id0x03cc1988'));"
    />

是否有更直接的技术可用?

XML 代码 http://emle.sourceforge.net/emle020000/testd1.xml :

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="testd1.xsl" type="text/xsl"?>
<emle xmlns="http://emle.sourceforge.net/emle020000" />

XSLT 代码 http://emle.sourceforge.net/emle020000/testd1.xsl :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:emle="http://emle.sourceforge.net/emle020000" xmlns:testd="http://emle.sourceforge.net/emle020000/testd" xmlns="http://www.w3.org/1999/xhtml">
   <xsl:output method="xml" media-type="application/xhtml+svg+mathml" encoding="UTF-8" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

   <xsl:template match="/emle:emle">
      <html>
      <head>
         <script type="text/javascript">
//<![CDATA[
function init(aThis) {alert("init(" + aThis + ")");
  var result = document.evaluate("//@testd_on_load",
    aThis.document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  for (var i=0; i<result.snapshotLength; i++){
    n=result.snapshotItem(i).nodeValue;
    eval(n);
  }
}
function testdGetElementById(aTestdID){alert("testdGetElementById("+aTestdID+")");
  return document.evaluate("//*[@testd_id='" + aTestdID + "']",
      document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).
    singleNodeValue;
  }
function testdOnChange(aNode){alert("testdOnChange("+aNode.nodeName+")");}
//]]>
      </script>
      </head>
      <body onload="init(this);">
      <testd:test>
        <xsl:attribute name="testd_id">TESTD_ID_<xsl:value-of select="generate-id()"/>
        </xsl:attribute>
        <xsl:attribute name="testd_on_load">testdOnChange(testdGetElementById(
        'TESTD_ID_<xsl:value-of select="generate-id()"/>'));</xsl:attribute>
      </testd:test>
      </body>
       </html>
  </xsl:template>
</xsl:stylesheet>

最佳答案

这看起来很奇怪,但如果我理解正确的话,您希望能够编写您的自定义事件处理程序,以便它们可以轻松获得对它们所附加的元素的引用。这应该不难;毕竟,您是自己调用自定义处理程序,所以您已经知道它附加到哪个元素 - 您只需要将其传递给处理程序本身:

function init(aThis) {
  var result = document.evaluate("//@testd_on_load",
    aThis.document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

  for (var i=0; i<result.snapshotLength; i++) {
    var n = result.snapshotItem(i); // attribute node
    var s = n.nodeValue; // script to run
    var e = n.ownerElement; // element for context

    (new Function(s)).call(e); // run script with `this` set to the context node
  }
}

现在您可以简化您的事件代码:

<xsl:attribute name="testd_on_load">testdOnChange(this);</xsl:attribute>

关于Javascript 比另一个属性上的 XSLT generate-id() 更好地识别回调节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/993231/

相关文章:

xml - 用 xslt 计算平均值

xslt - Wmic/格式开关无效的 XSL?

javascript - 陷入一段 JavaScript 有限状态机代码

javascript - 如何在 Jasmine 单元测试中使用 Sinon 模拟 jQuery 动画?

xml - 使用 FOP 在生成的 PDF 中保留空格

XSLT 3.0 Streaming with Grouping and Sum/Accumulator

javascript - 映射对象然后在页面上设置innerHTML会导致项目之间出现逗号

javascript - 替换并添加 3 个不同的参数到 url

c# - 如何使用 .NET XML 序列化序列化正则表达式类型

xml - PowerShell 的 Import-Clixml 来自字符串