2012-07-03 92 views
0

我有一個XML及其XSD文件。所以,XSD表示哪些是XML的必需字段,我需要提取它們 - 基本上只包含必需字段的新XML(坦率地說,我需要XSD中有minOccurs='1'的節點)。我知道我需要XSLT,但是有什麼方法/應用程序來生成XSLT,它只會提取XSD文件中具有minOccurs='1'的節點。使用XSD過濾XML

+0

有一些編輯器可讓您以xslt格式保存xsd文件,但AFAIK沒有一個編輯器可以在轉換之前將轉換應用於xsd文件。 –

回答

2

這是爲任意模式做這件事很棘手。例如,您可能會遇到類似(A B A?B)的內容模型,其中第一個A是強制性的,第二個是可選的。或者,當然,您可能會遇到minOccurs =「2」。我不認爲有任何捷徑;這是一個重要的項目。但是,如果您準備軟化需求,例如只處理以特定方式編寫的模式,或者避免使用尷尬的構造,那麼它可能會更容易。

+0

好吧,我不會遇到minOccurs =「2」,這是肯定的。我想到伍迪的建議使用XPath。但是你提到的很多例子像(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>