我有一个大问题,我甚至不确定我的问题是否存在解决方案...... 所以问题是: 我有一个 xsd 文件,我需要创建 XSLT ,这将创建html表 有2列:第一列是来自我的xsd文件的所有元素名称(4个示例xs:element name =“xxxxx”),第二列是相同元素名称=“xxxxx”的值,但值必须从xml文件中提取。
XSD
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:igt="http://www.yxz.com/global" xmlns:bgt="http://www.yxz.com/Prc" xmlns:xdb="http://xmlns.oracle.com/xdb" targetNamespace="http://www.yxz.com/Prc" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
<xs:import namespace="http://www.yxz.com/global" schemaLocation="global.xsd"/>
<xs:annotation>
<xs:appinfo>Prc 1.0, 19.11.2010</xs:appinfo>
<xs:documentation>Some description</xs:documentation>
</xs:annotation>
<xs:complexType name="TypePerson">
<xs:annotation>
<xs:documentation>Person</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="zzzzz" type="igt:String35Type" minOccurs="0">
<xs:annotation>
<xs:documentation>documentation for zzzz</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="wwwww" type="igt:String35Type" minOccurs="0">
<xs:annotation>
<xs:documentation>documentation for wwwww</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
(的 XML )
<ns2:globalResponse xmlns:ns2="http://www.yxz.com/PrcWs" xmlns="http://www.yxz.com/global" xmlns:ns3="http://www.yxz.com/Prc">
<ns2:Header>
<JobId>HfC8PH1LzUIzougK8qwFm5lX5KgTVzgs</JobId>
<MsgId>o9xVVPnVeBOZawdEqT8zOXx1g7U9tbBM</MsgId>
<Operation Id="IO001">text</Operation>
<Status Id="OK"/>
<SysDate>2011-03-24T11:27:36</SysDate>
</ns2:Header>
<ns2:Body>
<ns2:ViewResponse>
<ns3:ListPerson Size="1">
<ns3:Person>
<ns3:zzzzz>value of zzz</ns3:zzzzz>
<ns3:wwwww>value of www</ns3:wwwww>
</ns3:Person>
</ns3:ListPerson>
</ns2:ViewResponse>
</ns2:Body>
</ns2:globalResponse>
我想要[xslt]给出html表
||xsd element's documentation||value of element name in xml file||
----------------------------------------------------------------
||documentation for zzzz || value of zzz||
这是否可能,以及如何?
答案 0 :(得分:0)
您可以将架构作为输入参数传递给处理器,并使用转换中的document()
函数加载第二个XML。
此外,您需要在转换中仔细包含命名空间,以便能够选择所需的元素。
您可以使用以下测试作为起点。
XSLT 2.0 使用 Saxon 9.0.0.1J进行测试(在 Saxon 6.5.5上 XSLT 1.0 >)
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns2="http://www.yxz.com/PrcWs"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns="http://www.yxz.com/global"
xmlns:ns3="http://www.yxz.com/Prc"
exclude-result-prefixes="ns2 xs ns ns3">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="values" select="document('test_input2.xml')/ns2:globalResponse/ns2:Body/ns2:ViewResponse/ns3:ListPerson"/>
<xsl:template match="/">
<table>
<tr>
<th>element documentation</th>
<th>element value</th>
</tr>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="xs:element">
<tr>
<td><xsl:value-of select="@name"/>:<xsl:value-of select="xs:annotation/xs:documentation"/></td>
<td><xsl:value-of select="$values/ns3:Person/*[local-name()=current()/@name]"/></td>
</tr>
</xsl:template>
<xsl:template match="xs:annotation"/>
</xsl:stylesheet>
应用于问题样本输入,生成以下HTML表格:
<table>
<tr>
<th>element documentation</th>
<th>element value</th>
</tr>
<tr>
<td>zzzzz:documentation for zzzz</td>
<td>value of zzz</td>
</tr>
<tr>
<td>wwwww:documentation for wwwww</td>
<td>value of www</td>
</tr>
</table>