我有一个 XML 及其 XSD 文件。所以,XSD 说哪些是 XML 的必填字段,我只需要提取它们 - 基本上是一个只有必填字段的新 XML(坦率地说,我需要minOccurs='1'
XSD 中的节点)。我知道为此我需要 XSLT,但是有什么方法/应用程序可以生成一个 XSLT,它只会提取minOccurs='1'
XSD 文件中的节点。
问问题
1568 次
2 回答
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>
于 2012-07-03T09:49:59.100 回答
2
对任意模式执行此操作很棘手。例如,您可能会遇到像 (ABA?B) 这样的内容模型,其中第一个 A 是强制性的,第二个是可选的。或者,当然,您可能会遇到 minOccurs="2"。我认为没有捷径可走。这是一个重要的项目。但是,如果您准备好软化要求,例如只处理以特定方式编写的模式或避免笨拙的结构,那么它可能会更容易。
于 2012-07-03T12:13:54.003 回答