首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳过第一个节点并使用XSLT3.0复制节点的其余部分

跳过第一个节点并使用XSLT3.0复制节点的其余部分
EN

Stack Overflow用户
提问于 2022-05-20 14:52:58
回答 1查看 96关注 0票数 0

我需要跳过第一个Worker节点,然后使用XSLT3.0复制其余的节点

我的源XML是

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Workers>
    <Worker>
        <Employee>Emp</Employee>
        <ID>Identifier</ID>
    </Worker>
    <Worker>
        <Employee>12344</Employee>
        <ID>1245599</ID>
    </Worker>
    <Worker>
        <Employee>25644</Employee>
        <ID>7823565</ID>
    </Worker>
</Workers>

所期望的输出是

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Workers>
   <Worker>
      <Employee>12344</Employee>
      <ID>1245599</ID>
   </Worker>
   <Worker>
      <Employee>25644</Employee>
      <ID>7823565</ID>
   </Worker>
</Workers>

我拥有的XSLT是

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:strip-space elements="*"/>
    <xsl:output method="xml" indent="yes"/>


    <xsl:mode on-no-match="shallow-copy"/>

    <xsl:template match="Worker[position() = 1]"/>

</xsl:stylesheet>

上面的XSLT产生了我期望的输出,但我想看看是否有更好的方法不使用postion()跳过第一个节点,因为我不确定当前代码处理大型文件的效率(大约为800 MB)

我不得不使用以下方法从我的结果XML中删除空格

代码语言:javascript
复制
<xsl:strip-space elements="*"/>

有谁能检查我的代码,并提供任何建议,以即兴我的代码吗?

===============

有了Michael的建议,我的代码如下所示

代码语言:javascript
复制
    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0"  xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:strip-space elements="*"/>
   <xsl:output method="xml" indent="yes"/> 
    
  <!-- <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template> -->
 
 <!-- Removed above Identity Transformation -->

    <xsl:mode streamable="yes" on-no-match="shallow-copy"/>
    
    <xsl:template match="Workers">
        <xsl:copy>
            <xsl:apply-templates select="tail(Worker)"/>
        </xsl:copy>
    </xsl:template>    
    
</xsl:stylesheet>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-20 20:32:53

我会写的

代码语言:javascript
复制
<xsl:template match="Worker[1]"/>

为了可读性,但都是一样的。

与位置谓词匹配模式可能会执行得很糟糕,所以您应该谨慎行事,但像这样的简单模式应该可以。实际上,主要的不利后果可能是Saxon将在TinyTree中分配前面的同级指针,以便计算节点的同级位置。

Saxon有效地将其实现为

代码语言:javascript
复制
<xsl:template match="Worker[not(preceding-sibling::Worker)]"/>

你可能更喜欢这样写。然而,这两种形式都是可流的。

为了使其流化,您可以通过不选择不需要的节点来删除它们:

代码语言:javascript
复制
<xsl:template match="Workers">
  <xsl:copy>
    <xsl:apply-templates select="tail(Worker)"/>
  </xsl:copy>
</xsl:template>

在非流的情况下,这也可能要快一些;而且它节省内存,因为不需要前面的同级指针。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72320969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档