如何在 onclick 方法中应用模板

How to apply template in onclick method

所以我有一个 xslt 文件,其中包含两个以上的圆圈,这些圆圈通过它们的 ID 进行区分。当我单击一个圆圈时,我希望其他圆圈折叠并将单击的圆圈移动到特定位置。当我再次点击圆圈时,我希望所有其他圆圈再次显示在正确的位置。 我该怎么做?

使用 XSL 生成 SVG 后,最好使用 JavaScript 和 CSS 完成所有交互部分。这可能是一个例子:

var svg = document.getElementById('svg01');

svg.addEventListener('click', e => {
  if (e.target.nodeName == 'circle') {
    svg.querySelectorAll('circle').forEach(c => c.classList.remove('active'));
    e.target.classList.add('active');
    svg.classList.toggle('collaps');
  }
});
svg circle {
  transition: all .5s ease;
}

.collaps circle {
  r: 1px;
  opacity: 5%;
  cx: 1px;
  cy: 1px;
}

.collaps circle.active {
  r: 40px;
  opacity: 100%;
  cx: 50%;
  cy: 50%;
}
<svg xmlns="http://www.w3.org/2000/svg" id="svg01" viewBox="0 0 100 100" height="400">
  <circle cx="20" cy="20" r="5" fill="red"/>
  <circle cx="10" cy="30" r="5" fill="red"/>
  <circle cx="50" cy="20" r="5" fill="red"/>
  <circle cx="80" cy="40" r="5" fill="red"/>
  <circle cx="70" cy="10" r="5" fill="red"/>
</svg>

更新

OP 也想包括一段文字。所以,我在这里将圆圈和文本放在 <g> 元素中。我缩放并翻译每个 <g> 元素。问题是你不能混合 SVG 变换和 CSS 变换,所以所有的初始位置也在 CSS 中完成。使用 XSL,您可以制作一个 <style> 元素,它从 XML 元素中获取每个 id,例如: <style>g#id-of-element {translate: transform(10px, 50px)} ... </style> 作为我所有 nth-child 选择器的替代。顺便说一句:同时缩放和平移有点棘手...

var svg = document.getElementById('svg01');

svg.addEventListener('click', e => {
  if (e.target.nodeName == 'circle') {
    let g = e.target.closest('g');
    svg.querySelectorAll('g').forEach(g => g.classList.remove('active'));
    g.classList.add('active');
    svg.classList.toggle('collaps');
  }
});
svg g {
  transition: all .5s ease;
  transform-origin: center;
}

svg g:nth-child(1) {
  transform: translate(20px, 20px);
}

svg g:nth-child(2) {
  transform: translate(10px, 30px);
}

svg g:nth-child(3) {
  transform: translate(50px, 20px);
}

svg g:nth-child(4) {
  transform: translate(80px, 40px);
}

svg g:nth-child(5) {
  transform: translate(70px, 10px);
}

svg.collaps g {
  transform: translate(-25%, -25%) scale(.5);
  opacity: 5%;
}

.collaps g.active {
  transform: scale(8) translate(45%, 45%);
  opacity: 100%;
}
<svg xmlns="http://www.w3.org/2000/svg" id="svg01" viewBox="0 0 100 100" height="400">
  <g>
    <circle cx="5" cy="5" r="5" fill="red" />
    <text transform="translate(5 5)" font-size="4" dominant-baseline="middle" text-anchor="middle" pointer-events="none">Text</text>
  </g>
  <g>
    <circle cx="5" cy="5" r="5" fill="red" />
    <text transform="translate(5 5)" font-size="4" dominant-baseline="middle" text-anchor="middle" pointer-events="none">Text</text>
  </g>
  <g>
    <circle cx="5" cy="5" r="5" fill="red" />
    <text transform="translate(5 5)" font-size="4" dominant-baseline="middle" text-anchor="middle" pointer-events="none">Text</text>
  </g>
  <g>
    <circle cx="5" cy="5" r="5" fill="red" />
    <text transform="translate(5 5)" font-size="4" dominant-baseline="middle" text-anchor="middle" pointer-events="none">Text</text>
  </g>
  <g>
    <circle cx="5" cy="5" r="5" fill="red" />
    <text transform="translate(5 5)" font-size="4" dominant-baseline="middle" text-anchor="middle" pointer-events="none">Text</text>
  </g>
</svg>

我可以建议三个选项:

(a) 编写Javascript代码,在事件发生时对HTML页面进行更改(您仍然可以在第一时间使用XSLT生成HTML页面) .

(b) 使用 XSLT 处理器 API.

编写 Javascript 代码以在事件发生时调用修改 HTML 页面的新 XSLT 转换

(c) 按照 Martin Honnen 评论中的建议,使用 Saxon-JS 在 XSLT 3.0 中编写整个应用程序,包括事件处理。

这些中的哪一个对您有吸引力在很大程度上取决于您是更习惯于(并且更有效率)编写 Javascript 还是 XSLT —— 也许还考虑了代码的未来可维护性。