2

以下のような XML があります。

    <w:body>
   <w:p>
    <w:pPr>
       <w:pStyle w:val="paragraph"/>
     </w:pPr>
  <w:r><w:t>1274394 The milk costs , $1.99 [12] test Figure 1</w:t></w:r>
</w:p>
 <w:p>
  <w:pPr>
  <w:pStyle w:val="paragraph"/>
  </w:pPr>
  <w:r><w:t>sample text Figure 1 and [1]</w:t></w:r>
</w:p>
</w:body>

XSLT を使用して以下のような出力を得たいと考えています。

<w:body>
 <w:p>
  <w:pPr>
     <w:pStyle w:val="paragraph"/>
  </w:pPr>
  <w:r><w:t>1274394 The milk costs , $1.99 <ref>[12]</ref> test <fig>Figure 1</fig></w:t></w:r>
</w:p>
<w:p>
  <w:pPr>
  <w:pStyle w:val="paragraph"/>
  </w:pPr>
 <w:r><w:t>sample text <fig>Figure 1</fig> and <ref>[1]</ref></w:t></w:r>
</w:p>
</w:body>

私のXSLTは次のとおりです。

<xsl:template match="w:p[w:pPr/w:pStyle/@w:val='paragraph']//text()">
<xsl:param name="figregex">
  <xsl:text>(Figure)\p{Zs}([0-9]{1,2})</xsl:text>
</xsl:param>
<xsl:param name="matchedRegex">
  <xsl:text>(\[)([0-9]{1,2})(\])</xsl:text>
</xsl:param>
<xsl:variable name="fig-first" select="&quot;&lt;fig&gt;&quot;"/>
<xsl:variable name="fig-sec" select="&quot;&lt;/fig&gt;&quot;"/>
<xsl:variable name="r-first" select="&quot;&lt;ref&gt;&quot;"/>
<xsl:variable name="r-sec" select="&quot;&lt;/ref&gt;&quot;"/>
<xsl:analyze-string select="." regex="{$matchedRegex} | {$figregex} ">
<xsl:matching-substring>
<xsl:if test="matches(., $figregex)" >
    <xsl:value-of select="$fig-first" disable-output-escaping="yes"/><xsl:value-of select="."/>
    <xsl:value-of select="$fig-sec" disable-output-escaping="yes"/>
</xsl:if>
  <xsl:if test="matches(., $matchedRegex)" >
    <xsl:value-of select="$r-first" disable-output-escaping="yes"/><xsl:value-of select="."/>
    <xsl:value-of select="$r-sec" disable-output-escaping="yes"/>
  </xsl:if>
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <xsl:value-of select="."/>
  </xsl:non-matching-substring>
</xsl:analyze-string>
 </xsl:template>

正常に動作しますが、両方が同じ行に存在する場合、前にあるものが最初に変換されます。誰でもこれについて私を助けることができますか? 私が得ている出力は次のとおりです。

<w:body>
 <w:p>
  <w:pPr>
     <w:pStyle w:val="paragraph"/>
  </w:pPr>
  <w:r><w:t>1274394 The milk costs , $1.99 <ref>[12] </ref>test Figure 1</w:t></w:r>
 </w:p>
 <w:p>
  <w:pPr>
  <w:pStyle w:val="paragraph"/>
  </w:pPr>
  <w:r><w:t>sample text<fig> Figure 1 </fig>and [1]</w:t></w:r>
  </w:p>
 </w:body>
4

1 に答える 1

0

この XSLT 2.0 スタイルシート ...

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  xmlns:w="www"
  exclude-result-prefixes='xsl fn'>
<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>
      
<xsl:template match="w:t/text()">
 <xsl:variable name="phase1">
  <xsl:apply-templates select="." mode="fig" />
 </xsl:variable>
  <xsl:apply-templates select="$phase1" mode="ref" />
</xsl:template>


<xsl:template match="text()" mode="fig">
 <xsl:analyze-string select="." regex="Figure (\d{{1,2}})">
 <xsl:matching-substring>
  <fig>
   <xsl:value-of select="." />
  </fig>
 </xsl:matching-substring>
 <xsl:non-matching-substring>
  <xsl:value-of select="." />
 </xsl:non-matching-substring>
 </xsl:analyze-string>
</xsl:template>

<xsl:template match="text()" mode="ref">
 <xsl:analyze-string select="." regex="\[(\d{{1,2}})\]">
 <xsl:matching-substring>
  <ref>
   <xsl:value-of select="." />
  </ref>
 </xsl:matching-substring>
 <xsl:non-matching-substring>
  <xsl:value-of select="." />
 </xsl:non-matching-substring>
 </xsl:analyze-string>
</xsl:template>

<xsl:template match="@*|*|comment()|processing-instruction()" mode="ref">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()" mode="ref"/>
 </xsl:copy>
</xsl:template>
          
</xsl:stylesheet>  

...サンプル入力を次のように変換します...

<w:body xmlns:w="www">
    <w:p>
        <w:pPr>
            <w:pStyle w:val="paragraph"/>
        </w:pPr>
        <w:r>
            <w:t>1274394 The milk costs , $1.99 <ref>[12]</ref> test <fig>Figure 1</fig>
         </w:t>
        </w:r>
    </w:p>
    <w:p>
        <w:pPr>
            <w:pStyle w:val="paragraph"/>
        </w:pPr>
        <w:r>
            <w:t>sample text <fig>Figure 1</fig> and <ref>[1]</ref>
         </w:t>
        </w:r>
    </w:p>
</w:body>

ノート

  1. このスタイルシートは、パイプライン デザインを使用しています。最初の段階 ('fig') は Figure パターンを処理し、2 番目の段階 ('ref') は ref パターンを処理します。
  2. これは唯一の良い解決策ではありません。ref および fig モード テンプレートの代わりに、共通の名前付きテンプレートを使用することは、静かに実行可能であり、おそらくより厳密です。他の Stackie は、挑戦に立ち向かい、より単純なワンパス ソリューションを示したいと思うかもしれません。
  3. 本当に必要でない限り、disable-output-escaping を使用しないようにしてください。そうすることで、XSLT の多くの機能が失われます。これは、SQL 式を使用してデータセットを生成するのに似ていますが、アセンブラー コードを使用して列出力の 1 つを計算します。
  4. リテラル正規表現を使用する場合は、カーリーをダブルエスケープすることを忘れないでください。
于 2012-07-30T07:19:29.427 に答える