0

我有一个 XML 及其 XSD 文件。所以,XSD 说哪些是 XML 的必填字段,我只需要提取它们 - 基本上是一个只有必填字段的新 XML(坦率地说,我需要minOccurs='1'XSD 中的节点)。我知道为此我需要 XSLT,但是有什么方法/应用程序可以生成一个 XSLT,它只会提取minOccurs='1'XSD 文件中的节点。

4

2 回答 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 回答