gpt4 book ai didi

java - xslt - 无法使用属性选择器访问当前节点

转载 作者:太空宇宙 更新时间:2023-11-04 08:30:48 27 4
gpt4 key购买 nike

我正在尝试将带有 xsl 样式表的 xml 文件转换为 html。

这是java

TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource(classLoader.getResourceAsStream("driving.xsl")));
StreamResult drivingHtml = new StreamResult(new StringWriter());
transformer.transform(new StreamSource(classLoader.getResourceAsStream("driving.xml")), drivingHtml);
System.out.println(drivingHtml.getWriter().toString());

这是一些 xml:

<?xml version="1.0" encoding="UTF-8"?>
<user xmlns="http://notreal.org/ns1" xmlns:poi="http://notreal2.org/ns2">
<address type="primary">
<street>1031 Court St.</street>
<city>Monhegan, NY</city>
</address>

<address type="secondary">
<street> Elm St.</street>
</address>

这是 xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>User</title>
</head>
<body>
<p>Detailed Addresses</p>
<table>
<th>Primary</th>
<th>Secondary</th>
<tr>
<xsl:apply-templates select="/user/address"/>
</tr>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="address">
<td>
<xsl:value-of select=".[@type='primary']/street" />
<xsl:value-of select=".[@type='secondary']/street" />
</td>
<td>
<xsl:value-of select=".[@type='primary']/city" />
<xsl:value-of select=".[@type='secondary']/city" />
</td>
</xsl:template>
</xsl:stylesheet>

当我运行它时,我得到“无法编译样式表”

最佳答案

根据所提供的 XML 和 XSLT 代码,您的主要问题是您的代码根本没有解决 XML 文档中的元素位于默认命名空间中的事实

如何使用默认命名空间处理 XML 文档是一个常见问题解答 - 只需搜索 xslt 和 xpath 标签,您就会找到许多好的答案。

这是一种可能的解决方案:

这种转变:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://notreal.org/ns1"
exclude-result-prefixes="x">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/*">
<html>
<head>
<title>User</title>
</head>
<body>
<p>Detailed Addresses</p>
<table>
<thead>
<xsl:apply-templates select="x:address/@type"/>
</thead>
<tr>
<xsl:apply-templates select="x:address/x:street"/>
</tr>
<tr>
<xsl:apply-templates select="x:address/x:city"/>
</tr>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="@type">
<th><xsl:value-of select="."/></th>
</xsl:template>

<xsl:template match="x:address/*">
<td><xsl:value-of select="."/></td>
</xsl:template>
</xsl:stylesheet>

当应用于包含问题中提供的 XML 片段的完整且格式良好的 XML 文档时:

<user xmlns="http://notreal.org/ns1"
xmlns:poi="http://notreal2.org/ns2">
<address type="primary">
<street>1031 Court St.</street>
<city>Monhegan, NY</city>
</address>

<address type="secondary">
<street>203 Elm St.</street>
<city>Pittsburgh, PA</city>
</address>
</user>

产生(看起来是)想要的正确结果:

<html>
<head>
<title>User</title>
</head>
<body>
<p>Detailed Addresses</p>
<table>
<thead>
<th>primary</th>
<th>secondary</th>
</thead>
<tr>
<td>1031 Court St.</td>
<td>203 Elm St.</td>
</tr>
<tr>
<td>Monhegan, NY</td>
<td>Pittsburgh, PA</td>
</tr>
</table>
</body>
</html>

关于java - xslt - 无法使用属性选择器访问当前节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7563354/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com