使用XSD过滤XML
我有一个XML和它的XSD文件。因此,XSD说明哪些是XML的必填字段,我只需要提取它们——基本上是一个只包含必填字段的新XML(坦率地说,我需要XSD中具有使用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"> <
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,我将对它稍加修改,看看能做些什么