XSLT 选择唯一节点

发布于 2024-12-17 09:24:44 字数 573 浏览 0 评论 0原文

对于像我这样的 xslt 新手来说,这让我发疯。

输入:

<root>
    <a><name>kyle</name></a>
    <b><name>stan</name></b>
    <b><name>wendy</name></b>
    <b><name>cece</name></b>
</root>

预期输出:

<root>
        <a><name>kyle</name></a>
        <b><name>stan</name></b>
</root>

我被要求返回“root”下的第一个唯一节点,我该怎么做?

xslt 1.0 或 2.0 都可以。

太感谢了!!!!

this is driving me crazy, for xslt newbie like me.

Input:

<root>
    <a><name>kyle</name></a>
    <b><name>stan</name></b>
    <b><name>wendy</name></b>
    <b><name>cece</name></b>
</root>

Expected output:

<root>
        <a><name>kyle</name></a>
        <b><name>stan</name></b>
</root>

I was asked to return first unique node under 'root', how do I do that?

Either xslt 1.0 or 2.0 is fine.

Thank you so much!!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

自由如风 2024-12-24 09:24:44

XSLT 2.0 解决方案:

<?xml version="2.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
  <root>
    <xsl:for-each-group select="root/*" group-by="local-name()">
      <xsl:copy-of select="."/>
    </xsl:for-each-group>
    </root>
  </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <a>
      <name>kyle</name>
  </a>
   <b>
      <name>stan</name>
  </b>
</root>

XSLT 2.0 solution :

<?xml version="2.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
  <root>
    <xsl:for-each-group select="root/*" group-by="local-name()">
      <xsl:copy-of select="."/>
    </xsl:for-each-group>
    </root>
  </xsl:template>
</xsl:stylesheet>

Output:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <a>
      <name>kyle</name>
  </a>
   <b>
      <name>stan</name>
  </b>
</root>
风情万种。 2024-12-24 09:24:44

您可以匹配具有相同名称的前同级的任何元素,并且不输出任何内容。

XSLT 示例:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*/*[preceding-sibling::*[name() = current()/name()]]"/> 

</xsl:stylesheet>

输出(使用 Saxon 9 HE):

<root>
   <a>
      <name>kyle</name>
   </a>
   <b>
      <name>stan</name>
   </b>
</root>

You can match any element that has a preceding sibling with the same name and not output anything.

Example XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*/*[preceding-sibling::*[name() = current()/name()]]"/> 

</xsl:stylesheet>

Output (using Saxon 9 HE):

<root>
   <a>
      <name>kyle</name>
   </a>
   <b>
      <name>stan</name>
   </b>
</root>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文