如何在xsl中使用self::删除节点?

发布于 2025-01-07 06:00:14 字数 1196 浏览 0 评论 0原文

例如下面是我的 xsl 中的 xml

<products>
    <product>
        <name>Pen</name>
        <Quantity>2</Quantity>
        <Amount><Price>2</Price><Currency>USD</Currency></Amount>
    </product> 
    <product>
        <name>Pencil</name>
        <Quantity>20</Quantity>
        <Amount><Price>2</Price><Currency>USD</Currency></Amount>
    </product>
    <product>
        <name>Bag</name>
        <Quantity>25</Quantity>
        <Amount><Price>2</Price><Currency>USD</Currency></Amount>
    </product>
</products>

,我使用如下所示的方法删除

<xsl:copy-of select="node()[not(self::Quantity)]"/>

我还需要从 中删除子节点

我尝试如下

<xsl:copy-of select="node()[not(self::Quantity) and not(self::Amount/Currency)]"/>

但工作不正常。它将从 中删除所有节点

我如何仅删除子节点

for example below is the xml

<products>
    <product>
        <name>Pen</name>
        <Quantity>2</Quantity>
        <Amount><Price>2</Price><Currency>USD</Currency></Amount>
    </product> 
    <product>
        <name>Pencil</name>
        <Quantity>20</Quantity>
        <Amount><Price>2</Price><Currency>USD</Currency></Amount>
    </product>
    <product>
        <name>Bag</name>
        <Quantity>25</Quantity>
        <Amount><Price>2</Price><Currency>USD</Currency></Amount>
    </product>
</products>

in my xsl i using like below to remove

<xsl:copy-of select="node()[not(self::Quantity)]"/>

I also need to remove sub node <Currency> from the <Amount>

i try like below

<xsl:copy-of select="node()[not(self::Quantity) and not(self::Amount/Currency)]"/>

but not working fine . it will remove all node's from <Amount>

How i remove sub node <Currency> only?

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

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

发布评论

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

评论(1

鹿港小镇 2025-01-14 06:00:14

如果您确实想使用 self

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

或者如果您想了解其他更简单的方法:)

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

上述模板复制除 之外的所有其他标签

编辑:替换以下代码

<xsl:template match="product">
   <product>
    <xsl:for-each select="key('kProdByName', name)">
      <xsl:if test="position() = 1">
        <xsl:copy-of select="node()"/>
      </xsl:if>
    </xsl:for-each>
   </product>
</xsl:template>

为:(希望它有效)

  <xsl:template match="product">
    <product>
      <xsl:for-each select="key('kProdByName', name)">
        <xsl:if test="position() = 1">
          <xsl:apply-templates select="node()|@*"/>
      </xsl:if>
      </xsl:for-each>
    </product>
  </xsl:template>

  <xsl:template match="Currency|Quantity"/>

If you really want to use self

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

or if you want to know other simpler way :)

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

The above templates copy all other tags except <Currency>

EDIT: Replace the below code

<xsl:template match="product">
   <product>
    <xsl:for-each select="key('kProdByName', name)">
      <xsl:if test="position() = 1">
        <xsl:copy-of select="node()"/>
      </xsl:if>
    </xsl:for-each>
   </product>
</xsl:template>

By this: (hope it works)

  <xsl:template match="product">
    <product>
      <xsl:for-each select="key('kProdByName', name)">
        <xsl:if test="position() = 1">
          <xsl:apply-templates select="node()|@*"/>
      </xsl:if>
      </xsl:for-each>
    </product>
  </xsl:template>

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