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