Извлечь (схему) теги из xml - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть XML-файл, где информация о схеме включены. Чтобы проверить XML, я хочу извлечь информацию о схеме. Как я могу достичь этого с помощью phyton script или преобразования xslt? Проверка будет происходить в процессоре nifi xmlValidator.

Я пробовал преобразование xsl, но проблема в префиксе xsd.

    <?xml version="1.0" encoding="UTF-8"?>
    <root xmlns:xsd="http://www.w3.org/2001/XMLSchema"   xmlns:od="urn:schemas-microsoft-com:officedata">
    <xsd:schema>
    <xsd:element name="dataroot">
    <xsd:complexType>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element ref="AE"></xsd:element> 
   ...
    </xsd:schema> 
    <dataroot>
   ...</dataroot>
   </root>

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Следующая таблица стилей XSLT 2.0 разделяет документ на документ схемы и документ экземпляра.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.0"> 

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>  

    <xsl:template match="xsd:schema">
        <xsl:result-document href="schema.xsd">
            <xsl:copy-of select="." />
        </xsl:result-document>
    </xsl:template>  

</xsl:stylesheet>
0 голосов
/ 03 ноября 2019

Вы можете извлечь часть XSD из вашей следующей таблицы стилей XSLT-1.0. Сначала он соответствует элементу /root, а затем копирует все дочерние элементы xsd:... с пользовательским шаблоном идентификации :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0"> 
    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*" />

    <!-- Identity template for 'xsd' -->
    <xsl:template match="@*|node()" mode="xsd">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" mode="xsd" />
        </xsl:copy>
    </xsl:template>  

    <xsl:template match="/root/xsd:schema">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" mode="xsd" />
        </xsl:copy>
    </xsl:template>         

    <xsl:template match="text()" />
</xsl:stylesheet>

Результат:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="dataroot">
    <xsd:complexType>
      <xsd:choice maxOccurs="unbounded"><xsd:element ref="AE"/>

                    ...
                </xsd:choice>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Я проигнорировал ..., потому что они, вероятно, не являются частью XML.

...