Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSD过滤XML_Xml_Xslt_Xsd - Fatal编程技术网

使用XSD过滤XML

使用XSD过滤XML,xml,xslt,xsd,Xml,Xslt,Xsd,我有一个XML和它的XSD文件。因此,XSD说明哪些是XML的必填字段,我只需要提取它们——基本上是一个只包含必填字段的新XML(坦率地说,我需要XSD中具有minOccurs='1'的节点)。我知道我需要XSLT,但是是否有任何方法/应用程序可以生成XSLT,该XSLT只提取XSD文件中包含minOccurs='1'的节点。如果您将XSD文件用作文档,并且有一个简单的结构,您可以在一个文件中完成。因此,给出了以下模式: <xs:element name="nodes"> <

我有一个XML和它的XSD文件。因此,XSD说明哪些是XML的必填字段,我只需要提取它们——基本上是一个只包含必填字段的新XML(坦率地说,我需要XSD中具有
minOccurs='1'
的节点)。我知道我需要XSLT,但是是否有任何方法/应用程序可以生成XSLT,该XSLT只提取XSD文件中包含
minOccurs='1'
的节点。

如果您将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>

废话
废话

如果您将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>

废话
废话

对任意模式执行此操作很棘手。例如,您可能会遇到一个类似(ab?B)的内容模型,其中第一个a是必需的,第二个是可选的。当然,您可能会遇到minOccurs=“2”。我不认为有任何捷径;这是一个重要的项目。但是,如果您准备软化需求,例如只处理以特定方式编写的模式或避免尴尬的构造,那么这可能会更容易。

对于任意模式,这样做很棘手。例如,您可能会遇到一个类似(ab?B)的内容模型,其中第一个a是必需的,第二个是可选的。当然,您可能会遇到minOccurs=“2”。我不认为有任何捷径;这是一个重要的项目。但是,如果您准备软化需求,例如只处理以特定方式编写的模式或避免尴尬的构造,则可能会更容易。

有些编辑器允许您以xslt格式保存xsd文件,但是,在转换之前,没有一个编辑器可以对xsd文件应用转换。有一些编辑器可以让您以xslt格式保存xsd文件,但在转换之前,没有一个编辑器可以对xsd文件应用转换。当然,我不会遇到minOccurs=“2”。根据伍迪的建议,我考虑过使用XPath。但是你提到的例子很多,比如(a B a?B*)。我也有XMLSpy,我会稍微修改一下,看看能做些什么。Well,我肯定不会遇到minOccurs=“2”。根据伍迪的建议,我考虑过使用XPath。但是你提到的例子很多,比如(a B a?B*)。我还有XMLSpy,我将对它稍加修改,看看能做些什么