3

我一直在努力寻找摆脱某些特定标签的最佳解决方案。目前我使用一些正则表达式重复查找/替换,但肯定有更好的方法。只是不清楚如何直接在 xslt 中进行操作。

举个例子:

<local xml:lang="en">[Some Indicator]<div class="tab"/>some more content here</local>

我有很多这些,并且都遵循相同的结构,其中 [Some Indicator] 是一种列表标识符,可以是以下任何一种:

  • 一个或多个数字,有时后跟一个点
  • 一个字符,有时后跟一个连字符和另一个字符
  • 给定代码点范围内的一个字符(在本例中为 57600 到 58607)
  • 和其他一些是上面的变化

我想摆脱所有这些,而不必手动查找/替换几百次。我一直在尝试 xsl:analyze-string 但随后它会替换所有内容而不会影响位置。

一些例子 :

<some_nodes_above>
<local xml:lang="en">1<div class="tab"/>some more content here</local>
<local xml:lang="en">2.<div class="tab"/>some more content here</local>
<local xml:lang="fr">2-A<div class="tab"/>some more content here</local>
<local xml:lang="de">&#57600;<div class="tab"/>some more content here</local>
</some_nodes_above>

应该变成:

<some_nodes_above>
<local xml:lang="en">some more content here</local>
<local xml:lang="en">some more content here</local>
<local xml:lang="fr">some more content here</local>
<local xml:lang="de">some more content here</local>
</some_nodes_above>

所以我正在寻找一个 xslt(2) 脚本,它会说“每当你看到一个本地节点后跟一个给定的指示器和一个选项卡 div,剥离指示器和选项卡 div”。不是为这个例子寻找一个完整的解决方案,只是为了让我朝着正确的方向前进。如果我知道它如何适用于一种模式,我可能会自己找出其余的

提前致谢。

4

2 回答 2

2

用空字符串替换(?<=<local xml:lang="\w+">).+<div class="tab"/>包括正则表达式选项多行

于 2012-07-01T19:46:27.213 回答
2

这种转变

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

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

 <xsl:template match=
  "local/node()[1]
               [self::text()
          and
            following-sibling::node()[1]
               [self::div and @class eq 'tab']
              and
               (
                matches(., '^(\d\.?)|(.\-.)$')
               or
                 string-length(.) eq 1
                and
                 string-to-codepoints(.) ge 57600
                and
                 string-to-codepoints(.) le 58607
                )
               ]"/>

 <xsl:template match=
  "div[@class eq 'tab'
     and
       preceding-sibling::node()[1]
               [self::text()
              and
               (
                matches(., '^(\d\.?)|(.\-.)$')
               or
                 string-length(.) eq 1
                and
                 string-to-codepoints(.) ge 57600
                and
                 string-to-codepoints(.) le 58607
                )
               ]
      ]"/>
</xsl:stylesheet>

应用于提供的 XML 文档时

<some_nodes_above>
    <local xml:lang="en"
     >1<div class="tab"/>some more content here</local>
    <local xml:lang="en"
     >2.<div class="tab"/>some more content here</local>
    <local xml:lang="fr"
     >2-A<div class="tab"/>some more content here</local>
    <local xml:lang="de"
     >&#57600;<div class="tab"/>some more content here</local>
</some_nodes_above>

产生想要的正确结果:

<some_nodes_above>
   <local xml:lang="en">some more content here</local>
   <local xml:lang="en">some more content here</local>
   <local xml:lang="fr">some more content here</local>
   <local xml:lang="de">some more content here</local>
</some_nodes_above>
于 2012-07-01T20:47:26.500 回答