3

私は次のxmlを持っています

<xml>
    <para>
       <number>1</number>
       <text> Paragraph 1(<italic>A</italic>) is this para.</text>
    </para>
</xml>

単語 Paragraph で始まり、その後にスペースが続き、その後に 1 つ以上の数字が続き、その後に "(" が続き、ノードのイタリック体と数字と終了 ")" が続くパターンが見つかった場合は、テキスト要素と一致させたいと考えています。次に、その周りにアンカー タグを配置する必要があります。したがって、上記のxmlの出力は

 <xml>
    <para>
       <number>1</number>
       <text> <a href="Paragraph1(A)">Paragraph 1(<italic>A</italic>)</a> is this para.</text>
    </para>
</xml>

つまりParagraph 1(<italic>A</italic>)、タグに置き換え、href 値は、スペースやイタリック ノードのないテキストと一致する必要があります。

正規表現での処理方法に関するヘルプまたはヒント...

4

4 に答える 4

2

この XSLT 2.0 スタイルシートは、目的の結果を生成します。

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

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

    <!-- Only our text element requires special handling here....-->
    <xsl:template match="text[matches(.,'Paragraph\s+\d*')]">
        <xsl:copy>
            <xsl:variable name="textElement" select="."/>
            <xsl:analyze-string select="." regex="(Paragraph\s+\d*)(\(.*\))">
                <xsl:matching-substring>
                    <a href="{concat(replace(regex-group(1),'\s',''),regex-group(2))}">
                        <xsl:apply-templates select="$textElement/node()"/>
                    </a>
                </xsl:matching-substring>
            </xsl:analyze-string>       
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
于 2012-09-08T01:42:13.773 に答える
1

これにより、どのように解決できるかについてのアイデアが得られます。

<?xml version="1.0"?>

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

    <!-- Only our text element requires special handling here....-->
<xsl:template match="text">
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="matches(.,'Paragraph\s+\d*')">
                <!-- Save original text value here -->
                <xsl:variable name="temp" select="."/>
                <!-- Save the value of <italic>x</italic> child element -->
                <xsl:variable name="italic_val" select="italic/text()"/>
                <xsl:analyze-string select="." regex="(Paragraph\s+\d*)">
                    <xsl:matching-substring>
                        <xsl:element name="a">
                            <xsl:attribute name="href">
                                <xsl:value-of select="concat(replace(regex-group(1),'\s',''),'(',$italic_val,')')"/>
                            </xsl:attribute>
                            <xsl:value-of select="$temp"/>
                        </xsl:element>
                    </xsl:matching-substring>
                </xsl:analyze-string>

            </xsl:when>
            <xsl:otherwise>DOESNT MATCH</xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

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

<text>基本的に、XSLT ID テンプレートを使用して元のドキュメントをコピーし、要素を処理するテンプレートを定義します。そこで、その Text() コンテンツを分析し、適切な Regex: Paragraph を分析します。アンカーサブ構造を生成することがわかった場合。そのために、いくつかの一時変数を使用します。

ここに私の出力ファイル:

<xml>
  <para>
    <number>1</number>
    <text><a href="Paragraph1(A)"> Paragraph 1(A) is this para.</a></text>
  </para>
</xml>

私が得ているものではなく、まだ段落 1( <italic>A</italic>) がありません: 段落 1(A) ですが、それは微調整にすぎません...

このリンクを見てくださいXSLT の正規表現を理解するのに役立つかもしれません

XSLT 2.0 を使用していることに注意してください

于 2012-09-07T20:00:03.583 に答える
0

周囲の引用符なしのこの正規表現:

".*(Paragraph ([0-9]+)`\`(<italic>([0-9])</italic>`\`)"

値を提供する2つの埋め込みキャプチャグループを持つ1つの外側レベルのキャプチャグループを提供します。アウト レベルのキャプチャ グループは #1 で、2 つの埋め込みグループは #2 と #3 です。\「(」は正規表現では予約文字であるため、リテラル値「(」は「」でエスケープされることに注意してください。

于 2012-09-07T19:08:38.113 に答える
0

なぜこれに正規表現が必要なのですか? 以下のコードの何が問題になっていますか?

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="/xml/para/text">
    <xsl:copy>
      <a href="Paragraph1(A)">
        <xsl:apply-templates select="@*|node()"/>
      </a>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
于 2012-12-03T13:21:48.953 に答える