2012-07-03 3 views
0

У меня есть XML и его XSD-файл. Итак, XSD говорит, какие обязательные поля XML и мне нужно извлечь только их - в основном новый XML с только необходимыми полями (честно говоря, мне нужны узлы, которые имеют minOccurs='1' в XSD). Я знаю, что для этого мне нужен XSLT, но есть ли способ/приложение для создания XSLT, который будет извлекать только узлы с minOccurs='1' в XSD-файле.Фильтр XML с XSD

+0

Есть несколько редакторов, которые позволяют сохранять файлы xsd в формате xslt, но AFAIK не существует ни одного редактора, который также может применить преобразование к файлу xsd перед преобразованием. –

ответ

2

Это сложно сделать это для произвольной схемы. Например, вы можете столкнуться с моделью контента, например (A B A? B), где первый A является обязательным, а второй является необязательным. Или, конечно, вы можете столкнуться с minOccurs = "2". Я не думаю, что есть короткие сокращения; это важный проект. Однако, если вы готовы смягчить это требование, например, чтобы обрабатывать только схемы, написанные определенным образом или избегать неловких конструкций, тогда это может быть довольно просто.

+0

ну, я не буду сталкиваться с minOccurs = "2", это точно. Я думал об использовании XPaths по предложению Вуди. Но есть много примеров, которые вы упомянули как (A B A? B *). У меня также есть XMLSpy, я немного поработаю с ним и посмотрю, что можно сделать –

4

Если вы использовали файл xsd в качестве документа, и у вас была простая структура, вы могли бы сделать это в одном. Так дали схему:

<xs:element name="nodes"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="test1" minOccurs="1"/> 
     <xs:element name="test2" minOccurs="0"/> 
     <xs:element name="test3" minOccurs="0"/> 
     <xs:element name="test4" minOccurs="1"/> 
     <xs:element name="test5" minOccurs="0"/> 
     <xs:element name="test6" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

и XML-файл, такие как:

<nodes> 
    <test1>blah</test1> 
    <test2>blah</test2> 
    <test3>blah</test3> 
    <test4>blah</test4> 
    <test5>blah</test5> 
    <test6>blah</test6> 
</nodes> 

тогда таблица стилей:

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

     <xsl:variable name="xsd" select="document('so.xsd')"/> 
     <xsl:template match="/"> 
      <xsl:apply-templates select="nodes"/> 
     </xsl:template> 

     <xsl:template match="nodes"> 
      <allowed> 
       <xsl:variable name="allowedNodes" select="$xsd//xs:element[@name='nodes']"/> 
       <xsl:for-each select="*"> 
        <xsl:variable name="name" select="name()"/> 
        <xsl:if test="$allowedNodes//xs:element[@name=$name and @minOccurs='1']"> 
         <xsl:copy-of select="."/> 
        </xsl:if> 
       </xsl:for-each> 
      </allowed> 
     </xsl:template> 

    </xsl:stylesheet> 

даст вам:

<?xml version="1.0" encoding="UTF-8"?> 
<allowed xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <test1>blah</test1> 
    <test4>blah</test4> 
</allowed>