如何使用mxslt从xsd中提取元素名称和文档并将数据放入HTML表格?

时间:2011-05-28 10:04:23

标签: html xml xslt xsd

我有一个大问题,我甚至不确定我的问题是否存在解决方案...... 所以问题是: 我有一个 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||

这是否可能,以及如何?

1 个答案:

答案 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>