gpt4 book ai didi

xml - 如何使用 XSLT 显示 XSD 验证的 XML

转载 作者:数据小太阳 更新时间:2023-10-29 01:46:16 26 4
gpt4 key购买 nike

我已经为此争论了一段时间,但还没有找到明确的答案。

据我所知,我可以将数据存储在 XML 文件中,使用 XSD 对其进行验证,然后使用 XSLT 整齐地显示数据。

但是,我在尝试执行 XPath 查询以选择我希望在 XSLT 中显示的数据时遇到了问题。当我使用像“.//”或“*”这样的通用选择器时,我得到了我期望的结果。但是,当我尝试使用更具体的选择器时,例如:'root/responses' 或此处的任何其他变体,我没有得到任何结果。

XSD 正确验证了 XML 文件,因此我想我的数据至少在一定程度上是正确的。当我删除 XML 文件中的 XSD 引用时,有效地删除了数据验证,我的 XPath 查询突然开始工作了!有什么我想念的吗?我已尝试将 namespace 引用添加到 XSLT,但无济于事。

我在下面描述了 XSD、示例 XL 和示例 XSLT。任何帮助或提示将不胜感激!


定义结构的XSD 如下。这个 XSD 描述了一个简单的文档,它嵌套了三个元素,并应用了一个约束;响应代码的代码必须是唯一的。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="uitext"
targetNamespace="http://foo.bar/responsecode.xsd"
elementFormDefault="qualified"
xmlns:responsecodes="http://foo.bar/responsecode.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="root" type="responsecodes:rootType">
<xs:key name="responseCode">
<xs:selector xpath="responsecodes:responses/responsecodes:response">
<xs:annotation>
<xs:documentation>All defined responsecodes</xs:documentation>
</xs:annotation>
</xs:selector>
<xs:field xpath="@code">
<xs:annotation>
<xs:documentation>Unique responsecode</xs:documentation>
</xs:annotation>
</xs:field>
</xs:key>
</xs:element>

<xs:complexType name="rootType">
<xs:sequence>
<xs:element name="responses" minOccurs="1" maxOccurs="1" type="responsecodes:responseList">
<xs:annotation>
<xs:documentation>Defined responsecodes</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="responseList">
<xs:sequence>
<xs:element name="response" minOccurs="0" maxOccurs="unbounded" type="responsecodes:response"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="response">
<xs:sequence>
<xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation>
Explains the use of the responsecode.
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute name="code" type="xs:string" use="required">
<xs:annotation>
<xs:documentation>Unique code representing the response provided.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:schema>

示例 XML 文档如下:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="responsecode.xsl"?>
<root xmlns="http://foo.bar/responsecode.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://foo.bar/responsecode.xsd responsecode.xsd">
<responses>
<response code="firstCode">
<description>Explanation of first code</description>
</response>
<response code="secondCode">
<description>Explanation of second code</description>
</response>
<response code="thirdCode">
<description>Explanation of third code.</description>
</response>
</responses>
</root>

XML文件中引用的测试XSLT文档如下。 (这将以类似于 VS2008 枚举定义的格式显示所提到的代码,但除此之外)

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html><body><h2>Responses</h2>

<xsl:for-each select="root/responses/response">
<xsl:choose>
<xsl:when test="description != ''">
<br/>'''&lt;description&gt;
<br/>'''<xsl:value-of select="description" />
<br/>'''&lt;/description&gt;
</xsl:when>
</xsl:choose>
<br/>
<xsl:value-of select="@code" />

</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

最佳答案

简单的问题:您的 XML 元素位于您的 XSLT 一无所知的命名空间中。

<root xmlns="http://foo.bar/responsecode.xsd">
<responses>
<!-- ... -->
</responses>
</root>

把你的 <root>和所有后代元素到 "http://foo.bar/responsecode.xsd"命名空间。

像这样更改您的 XSL:

<xsl:stylesheet 
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:foo="http://foo.bar/responsecode.xsd"
exclude-result-prefixes="foo"
>
<xsl:template match="/">
<html>
<body>
<h2>Responses</h2>
<xsl:for-each select="foo:root/foo:responses/foo:response">
<!-- ... -->
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

请注意 namespace 是如何声明的以及如何为其赋予前缀的。之后,该 namespace 中的所有节点都使用该前缀进行引用。 exclude-result-prefixes用于确保命名空间不会不必要地出现在输出中。

关于xml - 如何使用 XSLT 显示 XSD 验证的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1756652/

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