0

私の XSL-FO 変換は、以下に指定された XML では機能しません。これらの xmlns と schemaLocation が変換を妨げているようです。

<book
xmlns="http://www.example.org/book"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/book book.xsd">

    <title>Something</title>
</book>

しかし、以下のように XML を書き直すと、変換がスムーズに実行され、XSL 内のすべての XPath が適切に実行されます。

<book>
    <title>Something</title>
</book>

私の質問は次のとおりです。スキーマの場所などを決定する数行のコードを無視する方法はありますか???

前もって感謝します!

Java クラス:

public static void generirajPDF() {
    try {

        // Setup directories
        File baseDir = new File(".");
        File outDir = new File(baseDir, "pdf");
        outDir.mkdirs();

        // Setup input and output files
        File xmlfile = new File(baseDir, "WebContent/AvtoSolaZ2.xml");
        File xsltfile = new File(baseDir, "WebContent/AvtoSolaZaposleniXSL.xsl");
        File pdffile = new File(outDir, "Test.pdf");

        // configure fopFactory as desired
        FopFactory fopFactory = FopFactory.newInstance();

        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
        // configure foUserAgent as desired

        // Setup output
        OutputStream out = new java.io.FileOutputStream(pdffile);
        out = new java.io.BufferedOutputStream(out);

        try {
            // Construct fop with desired output format
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

            // Setup XSLT
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory
                    .newTransformer(new StreamSource(xsltfile));

            // Set the value of a <param> in the stylesheet
            transformer.setParameter("versionParam", "2.0");

            // Setup input for XSLT transformation
            Source src = new StreamSource(xmlfile);

            // Resulting SAX events (the generated FO) must be piped through
            // to FOP
            Result res = new SAXResult(fop.getDefaultHandler());

            // Start XSLT transformation and FOP processing
            transformer.transform(src, res);

        } finally {
            out.close();
        }

        if (pdffile.toString().endsWith(".pdf"))
            Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + pdffile);
        else {
            Desktop desktop = Desktop.getDesktop();
            desktop.open(pdffile);
        }

        System.out.println("Konec");

    } catch (Exception e) {
        e.printStackTrace(System.err);
        System.exit(-1);
    }
}
4

3 に答える 3

2

XSLT 2.0 プロセッサを使用して XSLT を実行する場合は、

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transformation"
  xpath-default-namespace="http://www.example.org/book"
  version="2.0">

スタイルシートのルート要素で、コード内の一致パターンと XPath 式を変更する必要はありません。

XSLT 1.0 プロセッサを使用している場合は、次のようにして名前空間に対応するようにコードを書き直す必要があります。

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transformation"
  xmlns:df="http://www.example.org/book"
  exclude-result-prefixes="df"
  version="1.0">

<xsl:template match="df:book">
  <xsl:value-of select="df:title"/>
</xsl:template>
于 2012-11-18T18:32:08.060 に答える
0

この質問は 1 日 1 回程度行われます。「XSLT デフォルト名前空間」を検索するだけです。要素を名前空間に配置すると名前が変更され、正しい名前空間で検索された場合にのみ、変換によってそれらが検出されます。

于 2012-11-19T08:59:17.660 に答える
0

XML 入力が

<book  xmlns="http://www.example.org/book" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/book book.xsd">
<title>Something</title>
</book>

スタイルシートは

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/*[local-name()='book']">
    <root>Matched the root with name space why not others</root>
</xsl:template>
</xsl:stylesheet>

あなたの出力は次のようになります

<?xml version="1.0" encoding="UTF-8"?>
<root>Matched the root with name space why not others
</root>

local-name() 関数は XSLT 1.0 (http://www.xsltfunctions.com/xsl/fn_local-name.html) の一部であり、名前空間なしで要素名のみに一致します。

于 2012-11-18T18:12:47.590 に答える