2

私は今しばらく苦労しました。xslt を使い始めたばかりで、問題なく動作するようになりました。可能な限りテンプレートを使用し、for ループを使用しないようにしています。

私の問題は次のとおりです。似たような名前のノードがいくつかありますが、違いは 1 から (現在) 5 までの接尾辞番号だけです。これらはすべて、番号のないノードに変換する必要があります。基本的に、ここに私が持っているものがあります:

<title1>some title</title1>
<some_other_nodes>....</some_other_nodes>
<title2>some title2</title2>
.
.
.
<title5>....</title5>

そして、これは私が欲しいものです:

<title>some title</title>
.
.
.
<title>some title2</title>
.
.
.
<title>....</title>

テンプレートと部分文字列の一致 (タイトル部分のみの一致) を行うことは可能ですか?

ご協力いただきありがとうございます!

4

2 に答える 2

2

タイトルNの形式の要素(Nは数値)の場合、...のような一致条件を使用します。

(修正:)

<xsl:template match="*[starts-with(name(),'title')]
                      [number(substring(name(),6))=number(substring(name(),6))]">
  etc...

一般的ではありませんが、迅速で汚いです。特にtitle1からtitle5が必要な場合は、...

<xsl:template match="title1|title2|title3|title4|title5">
于 2012-09-20T07:51:20.240 に答える
1

これは、他の回答ではカバーされていない、最も複雑なケースでもカバーする真のXSLT2.0ソリューションです

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

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

 <xsl:template match="*[matches(name(), '^title.*?\d+$')]">
  <xsl:element name="{replace(name(), '^(title.*?)\d+$', '$1')}">
    <xsl:copy-of select="namespace::*"/>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合

<t>
    <title1>some title</title1>
    <some_other_nodes>....</some_other_nodes>
    <title2>some title2</title2> . . . 
    <title5>....</title5>
    <titleX253>Complex title</titleX253>
</t>

必要な正しい結果が生成されます:

<t>
      <title>some title</title>
      <some_other_nodes>....</some_other_nodes>
      <title>some title2</title> . . . 
    <title>....</title>
      <titleX>Complex title</titleX>
</t>

要素に注意してください

<titleX253>Complex title</titleX253>

次のように変換する必要があります

<titleX>Complex title</titleX>

これはショーン・ダーキンの答えではありません

于 2012-09-20T12:43:08.833 に答える