1

属性を「book1chapter2」から「chapter2」に変換することはできますか?

たとえば、このノード:

<a myAttribute="part1chapter2" />

に変換する必要があります

<a myAttribute="chapter2" />

私は試した:

<xsl:variable name="chapter" select="replace('part1chapter2', 'book1', '')" />

しかし、それはコンパイルエラーになります:

ERROR:  'Error checking type of the expression 'funcall(replace, [literal-expr(part1chapter2), literal-expr(part1), literal-expr()])'.'
FATAL ERROR:  'Could not compile stylesheet'

XSLT バージョン 2.0 を使用しています。

ライブラリのないソリューションをいただければ幸いです:)

編集:

Java コード。javac -g TestXslt.java でコンパイルおよび実行します。Java TestXslt;

public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {
    TransformerFactory factory = TransformerFactory.newInstance();
    Source xslt = new StreamSource(new File("../transform.xslt"));
    Transformer transformer = factory.newTransformer(xslt);

    Source text = new StreamSource(new File("../input.xml"));
    String r = new String();
    StreamResult result = new StreamResult(new File("../output.xml"));
    transformer.transform(text, result);
}

Java バージョン javac 1.6.0_27

4

3 に答える 3

6

スタイルシートで version="2.0" と指定すると、XSLT 2.0 プロセッサが自動的に取得されると想像していると思います。それはそれが機能する方法ではありません。取得するプロセッサは、クラスパスの内容によって決まります。デフォルトの JDK プロセッサを選択すると、XSLT 1.0 のみがサポートされます。XSLT 1.0 の仕様では、replace() などの認識されない関数の呼び出しが検出された場合、実行時エラーが発生する必要があると規定されています。

これを XSLT 2.0 で実行するには、Saxon をダウンロードし、それがクラスパスにあることを確認します。理想的には、堅牢性のために、JAXP 読み込みメソッドに依存せずに、明示的に読み込みます。それ以外の

TransformerFactory factory = TransformerFactory.newInstance();

行う

TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();
于 2013-03-01T11:26:18.057 に答える
1

属性の内容を変更しようとしているのか、属性名を変更しようとしているのかよくわかりません。

前者の場合、置換関数のパラメーターは(input-string、regex、replacement-string)であるため、のようなものを試すことができますreplace(@attributeToChange, 'book1chaper2', 'book1')。後者の場合、次のようなものが必要だと思います。

<xsl:attribute name="book1">
    <xsl:value-of select="@book1chaper2"/>
</xsl:attribute>

編集

ただし、コンパイラエラーが発生するのは奇妙なことです。XSLTエンジンのその機能に問題がある場合、別のアプローチ(内容を変更する場合)は次のようになります。

<xsl:choose>
    <xsl:when test="@attributeToChange='book1chaper2'">
         <xsl:text>book1</xsl:text>
    </xsl:when>
    <xsl:otherwise>
         <xsl:value-of select="@attributeToChange"/>
    </xsl:otherwise>
</xsl:choose>

さらに編集

お使いのプロセッサはおそらくXSLT1.0のようです。

EclipseでXSLTを実行するとエラーが発生します

starts-with(@attributeToChange, 'book1')それ以外の場合は、選択のテストとして使用してみてください。

于 2013-03-01T10:53:00.867 に答える
0

これを簡単に行うことができます:

<xsl:variable name="chapter" select="substring-after('book1chapter2', 'book1', '')" />

しかし、値の先頭には常に「book1」が含まれますか? 「book1」の値を別の場所から取得しているため、削除する部分が常にわかりますか?

于 2013-03-01T10:53:43.087 に答える