Как извлечь имя элемента и документацию из xsd с помощью mxslt и поместить данные в таблицу HTML? - PullRequest
1 голос
/ 28 мая 2011

У меня большая проблема, и я даже не уверен, существует ли решение для моей проблемы ... Итак, проблема в следующем: У меня есть xsd файл, и мне нужно создать XSLT , который будет создавать HTML-таблицы с 2 столбцами: первый столбец для всех имен элементов (4 примера xs: element name = "xxxxx") из моего файла xsd, а второй столбец - это значение того же элемента name = "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 голосов
/ 29 мая 2011

Вы можете передать схему в качестве входного параметра в процессор и загрузить второй XML с помощью функции document() в преобразовании.

Более того, вам необходимо тщательно включить пространства имен внутри преобразования, чтобы иметь возможностьдля выбора нужных элементов.

Вы можете использовать следующий тест в качестве отправной точки.


XSLT 2.0 протестировано с Saxon 9.0.0.1J (также работает как XSLT 1.0 на Saxon 6.5.5 )

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...