0

XMLとそのXSDファイルがあります。minOccurs='1'したがって、XSDは、XMLの必須フィールドを示し、それらだけを抽出する必要があります。基本的に、必須フィールドのみを含む新しいXMLです(率直に言って、XSDにあるノードが必要です)。これにはXSLTが必要であることを認識していますがminOccurs='1'、XSDファイルにあるノードのみを抽出するXSLTを生成する方法/アプリケーションはありますか。

4

2 に答える 2

4

xsdファイルをドキュメントとして使用し、構造が単純な場合は、1つで実行できます。したがって、次のスキーマが与えられます。

<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

任意のスキーマに対してこれを行うのは難しいです。たとえば、最初のAが必須で、2番目がオプションである(ABA?B)のようなコンテンツモデルに遭遇する場合があります。または、もちろん、minOccurs="2"に遭遇する可能性があります。ショートカットはないと思います。それは重要なプロジェクトです。ただし、たとえば特定の方法で記述されたスキーマのみを処理したり、厄介な構造を回避したりするなど、要件を緩和する準備ができている場合は、かなり簡単になる可能性があります。

于 2012-07-03T12:13:54.003 に答える