1

HTMLの一部のリストアイテムから不要なコンテンツを削除したい。基本的に、特定のスパンより前のすべてのコンテンツを([クラス]タブで)削除したいのですが、このスパンより前のコンテンツがいくつかの基準に一致する場合に限ります。

たとえば、以下の例を見てください。

<ol class="ast">
  <li>*<span class="tab"><!--tab--></span>Some blabla <img href="#">with a link.</a></li>
  <li>**<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
</ol>

私が手に入れたいのは次のとおりです。

<ol class="ast">
  <li>Some blabla <img href="#">with a link.</a></li>
  <li>Some other blabla, this one without other elements</li>
</ol>

または、言葉で説明すると、1つ以上のアスタリスクで始まり、タブスパンが続くリスト項目がある場合は、スパンの後のコンテンツのみを保持します。

私は少し浮気してきましたが、私のニーズを満たすものを見つけることができなかったので、どんなアドバイスも歓迎します!

4

2 に答える 2

0

どうですか:

<xsl:stylesheet 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
    exclude-result-prefixes="xs">

    <xsl:template match="@*|node()">
     <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
     </xsl:copy>
    </xsl:template>
    <xsl:template match="li/node()[1]
                                  [self::text() and 
                                   matches(., '^\*+$') and
                                   following-sibling::node()[1]
                                            [self::span and @class = 'tab']
                                   ]" />
    <xsl:template match="li/node()[2]
                                  [self::span and @class = 'tab']
                                  [matches(preceding-sibling::text(), '^\*+$')]" />

</xsl:stylesheet>

この入力で実行する場合:

<ol class="ast">
  <li>*<span class="tab"><!--tab--></span>Some blabla <a href="#">with a link.</a></li>
  <li>Not asterisks!<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
  <li>**<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
  <li>***<span>hello</span>Some other blabla, this one without other elements</li>
  <li><a href="#">with a link.</a>*<span class="tab">Some blabla </span></li>
</ol>

結果は次のとおりです。

<ol class="ast">
  <li>Some blabla <a href="#">with a link.</a></li>
  <li>Not asterisks!<span class="tab"/>Some other blabla, this one without other elements</li>
  <li>Some other blabla, this one without other elements</li>
  <li>***<span>hello</span>Some other blabla, this one without other elements</li>
  <li><a href="#">with a link.</a>*<span class="tab">Some blabla </span></li>
</ol>
于 2013-03-15T16:08:20.787 に答える
0

現在受け入れられている解決策は正しくなく、一般的に誤った結果を生成します。たとえば、このXMLファイルに適用すると

<ol class="ast">
  <li><a href="#">with a link.</a>*<span class="tab">Some blabla </span></li>
  <li>Something else</li>
</ol>

この誤った結果(spanおよびテキストが誤って削除される)が生成されます:

<?xml version="1.0" encoding="UTF-8"?><ol class="ast">
  <li><a href="#">with a link.</a></li>
  <li>Something else</li>
</ol>

これが1つの正しい解決策です:

<xsl:stylesheet version="1.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=
  "li/node()[1]
     [self::text() and not(translate(.,'*',''))
     and following-sibling::node()[self::span[@class='tab']]
     ]"/>

 <xsl:template match=
  "li/node()[2]
      [self::span[@class='tab']
     and preceding-sibling::node()[1]
             [self::text() and not(translate(.,'*',''))]
      ]
 "/>
</xsl:stylesheet>

提供されたXMLドキュメントに適用した場合

<ol class="ast">
  <li>*<span class="tab"><!--tab--></span>Some blabla <a href="#">with a link.</a></li>
  <li>Not asterisks!<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
  <li>**<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
  <li>***<span>hello</span>Some other blabla, this one without other elements</li>
</ol>

この変換により、必要な正しい結果が得られます。

<ol class="ast">
  <li>*<span class="tab"><!--tab--></span>Some blabla <a href="#">with a link.</a></li>
  <li>Not asterisks!<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
  <li>**<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
  <li>***<span>hello</span>Some other blabla, this one without other elements</li>
</ol>

上記の最初のXMLドキュメントに適用した場合:

<ol class="ast">
    <li><a href="#">with a link.</a>*<span class="tab">Some blabla </span>
    </li>
    <li>Something else</li>
</ol>

ここでも正しい結果が生成されます。

<ol class="ast">
   <li>
      <a href="#">with a link.</a>*<span class="tab">Some blabla </span>
   </li>
   <li>Something else</li>
</ol>
于 2013-03-16T05:38:27.487 に答える