排除所选元素的某些部分的 XPath? [英] XPath that excludes some part of selected element?

查看:30
本文介绍了排除所选元素的某些部分的 XPath?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

XML:

    <root>
      <rows>
        <row hash="156458">
          <column name="Id">1</column>
          <column name="Nome">Evandro</column>
          <column name="CPF">98765432100</column>
        </row>
        <row hash="52458">
          <column name="Id">2</column>
          <column name="Nome">Everton</column>
          <column name="CPF">12345678900</column>
        </row>
      </rows>
    </root>

XPath 查询:

<代码>./root/rows/row/column[@name='Nome'] |./root/rows/row/column[@name='CPF']

XPath 返回:

    <root>
      <column name="Nome">Evandro</column>
      <column name="CPF">98765432100</column>
      <column name="Nome">Everton</column>
      <column name="CPF">12345678900</column>
    </root>

我希望 XPath 返回什么:

What I wish the XPath return:

    <root>
      <rows>
        <row hash="156458">
          <column name="Nome">Evandro</column>
          <column name="CPF">98765432100</column>
        </row>
        <row hash="52458">
          <column name="Nome">Everton</column>
          <column name="CPF">12345678900</column>
        </row>
      </rows>
    </root>

我想让 xpath 在我进行查询时保留文档结构.

I want to make the xpath preserve the document structure when I make the query.

推荐答案

XPath 非常适合选择,但不适用于结构化.加强对两者的完整 XSLT.您只需要一个简单的基于身份的转换...

XPath's great for selecting but not for structuring. Step up to full XSLT for both. A simple identity-based transformation is all you need...

鉴于此 XML 输入:

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <rows>
    <row hash="156458">
      <column name="Id">1</column>
      <column name="Nome">Evandro</column>
      <column name="CPF">98765432100</column>
    </row>
    <row hash="52458">
      <column name="Id">2</column>
      <column name="Nome">Everton</column>
      <column name="CPF">12345678900</column>
    </row>
  </rows>
</root>

这个 XSLT 转换:

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

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

  <xsl:template match="column[@name='Id']"/>

</xsl:stylesheet>

将产生所需的 XML 输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <rows>
      <row hash="156458">
         <column name="Nome">Evandro</column>
         <column name="CPF">98765432100</column>
      </row>
      <row hash="52458">
         <column name="Nome">Everton</column>
         <column name="CPF">12345678900</column>
      </row>
   </rows>
</root>

注意事项:

  • 第一个模板是标识模板;它将从中复制节点输入到输出,除非有更具体的模板覆盖它.
  • 第二个模板是省略Id columns 的覆盖.
  • The first template is the identify template; it will copy nodes from input to output unless a more specific template overrides it.
  • The second template is an override to omit Id columns.

这篇关于排除所选元素的某些部分的 XPath?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆