我的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);
}
}
答案 0 :(得分: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>
答案 1 :(得分: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)的一部分,它只匹配没有名称空间的元素名称。
答案 2 :(得分:0)
这个问题每天都会被问到一次。只需搜索“XSLT默认命名空间”。将元素放在命名空间中会改变它们的名称,只有当它在正确的命名空间中查找时,转换才会找到它们。