微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xslt 删除特定元素周围的空白xml 到 xml

如何解决xslt 删除特定元素周围的空白xml 到 xml

我有很多 XML 文件,其中从数据库导出通过缩进添加了某些空格,现在我希望在 XSLT 3.0 转换中将其删除为新的 xml 输出。我想删除 <lb><pb> 周围导出引入的空格(在原始文件中,在导出之前,这两个元素与没有空格的其他元素相邻 - 导出中的一个隐藏错误使它们缩进)。

这是要转换的问题文件的示例:

<p xml:id="MS609-0783-LA" xml:lang="LA">
       <seg type="dep_event" xml:id="MS609-0783-1">
          <pb n="58r"/>
          <lb n="1"/>Item. 
          <date type="deposition_date" when="1245-07-07">Anno Domini M°CC°XL°V° Nonas Iulii</date><persName
            nymRef="#ber_r_baz-hg" role="dep">Ber. R.</persName> testis juratus dixit quod vidit
        <persName nymRef="#heretics_in_public" ref="her">hereticos</persName>.</seg>
</p>

此处是所需 XML 输出的示例:

<p xmlns="http://www.tei-c.org/ns/1.0" xml:id="MS609-0783-LA" xml:lang="LA">
    <seg type="dep_event" xml:id="MS609-0783-1"><pb n="58r"/><lb n="1"/>Item. 
        <date type="deposition_date" when="1245-07-07">Anno Domini M°CC°XL°V° Nonas Iulii</date> <persName
            nymRef="#ber_r_baz-hg" role="dep">Ber. R.</persName> testis juratus dixit quod vidit
        <persName nymRef="#heretics_in_public" ref="her">hereticos</persName>.</seg>
</p>

我天真地以为我可以这样定位:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:tei="http://www.tei-c.org/ns/1.0"
    version="3.0">

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

  <xsl:output method="xml"/>

  <xsl:template match="/">
        <xsl:apply-templates/>
   </xsl:template>
 
   <xsl:template match="text()[normalize-space(.) = '']">
       <xsl:choose>
           <xsl:when test="./following-sibling::tei:pb">
               <xsl:text/>
           </xsl:when>
           <xsl:when test="./following-sibling::tei:lb">
               <xsl:text/>
           </xsl:when>
           <xsl:otherwise>
               <xsl:text> </xsl:text>
           </xsl:otherwise>
       </xsl:choose>
   </xsl:template>
</xsl:stylesheet>

但它没有产生想要的结果:https://xsltfiddle.liberty-development.net/93nwMpi

理想情况下,我正在努力寻找一种解决方案,在 <pb> 和/或 <lb> 之前或之后去除任何空白空间(当它们与其他元素相邻时) ),在 <seg> 或其后代中的任何位置。

非常感谢您的指点。

解决方法

我不清楚您要删除哪些文本节点,但是

pip install pandas

将仅去除空白,后跟 <xsl:template match="tei:seg//text()[not(normalize-space())][following-sibling::node()[1][self::tei:pb | self::tei:lb]]"/> pb 内的 lb

当然,您可以将其扩展到那些元素前面的元素,例如

seg

如果基于匹配模式的简单阻塞还不够,您可能想尝试是否可以用 <xsl:template match="tei:seg//text()[not(normalize-space())][preceding-sibling::node()[1][self::tei:pb | self::tei:lb] or following-sibling::node()[1][self::tei:pb | self::tei:lb]]"/> group-adjacent 以某种方式表达“邻接”的定义,然后删除任何空白节点在一个组中,例如

xsl:for-each-group

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。