1

RelaxNGXMLスキーマの注釈から非常に単純なドキュメントを生成しようとしています。たとえば、次のRelaxNGがあるとします。

<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
    <start>
        <element name="topNode">
            <ref name="topNode-ref"/>
        </element>
    </start>

    <define name="topNode-ref">
        <a:documentation>This is the top of the doc.</a:documentation>
        <oneOrMore>
            <element name="level1">
                <ref name="level1-ref"/>
            </element>
        </oneOrMore>
    </define>

    <define name="level1-ref">
        <a:documentation>Here's some notes about level1.</a:documentation>
        <attribute name="att1">
            <a:documentation>Details about att1.</a:documentation>
        </attribute>
        <element name="subLevel2">
            <ref name="subLevel2-ref"/>
        </element>
    </define>

    <define name="subLevel2-ref">
        <a:documentation>Notes on subLevel2.</a:documentation>
        <attribute name="subAtt"/>
        <zeroOrMore>
            <element name="subLevel3">
                <ref name="subLevel3-ref"/>
            </element>
        </zeroOrMore>
    </define>

    <define name="subLevel3-ref">
        <a:documentation>And here is subLevel3.</a:documentation>
        <attribute name="subSubAtt"/>
    </define>
</grammar>

これは、次のようなXMLファイルを有効にするために使用されます。

<?xml version="1.0" encoding="UTF-8"?>
<topNode>
    <level1 att1="some test">
        <subLevel2 subAtt="more text"></subLevel2>
    </level1>

    <level1 att1="quick">
        <subLevel2 subAtt="brown">
            <subLevel3 subSubAtt="fox"></subLevel3>
        </subLevel2>
    </level1>   
</topNode>

各要素/属性への基本的なXPathをリストしたドキュメントを作成し、対応するドキュメントの注釈を表示できるようにしたいと思います。例えば:

/topNode
This is the top of the doc.

/topNode/level1
Here's some notes about level1

/topNode/level1/@att1
Details about att1.

etc...

最終的には、「zeroOrMore」、可能なデータ型などに関するドキュメントを追加しますが、最初にこの最初のステップを解決する必要があります。

TechquilaRELAX-NGドキュメントツールを見つけました。rng to docbookスタイルシートをいじってみましたが、探しているものが実行されません。私が知る限り、XPathに関する詳細はなく、要素を個別にリストするだけです。目的の出力を取得するための開始点としてどのように使用できるかわかりません。

提供されているRelaxNGの例を前提として、XSLTを使用してこのタイプのドキュメント出力を生成することは可能ですか(もしそうなら、どのようにですか?)?

XSLTは理想的ですが、必須ではありません。私は仕事を成し遂げるために何でも開いています。

4

1 に答える 1

2

これは、例のような非常に単純な文法で機能します。

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:r="http://relaxng.org/ns/structure/1.0" 
    xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
>
<xsl:output method="text" />

<xsl:template match="/">
    <xsl:apply-templates select="//r:define[a:documentation] | //r:attribute[a:documentation]" />
</xsl:template>

<xsl:template match="r:define">
    <xsl:variable name="doc" select="a:documentation" />
    <xsl:call-template name="print-path">
        <xsl:with-param name="elm" select="//r:element[r:ref/@name=current()/@name]" />
    </xsl:call-template>
    <xsl:value-of select="$doc" /><xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="r:attribute">
    <xsl:variable name="doc" select="a:documentation" />
    <xsl:call-template name="print-path">
        <xsl:with-param name="elm" select="//r:element[r:ref/@name=current()/ancestor::r:define/@name]" />
        <xsl:with-param name="path" select="concat('/@',@name)" />
    </xsl:call-template>
    <xsl:value-of select="$doc" /><xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template name="print-path">
    <xsl:param name="elm" />
    <xsl:param name="path" />

    <xsl:variable name="parent" select="//r:ref[@name=$elm/ancestor::r:define/@name]/ancestor::r:element" />
    <xsl:message><xsl:value-of select="$elm/@name" /></xsl:message>
    <xsl:choose>
        <xsl:when test="$parent">
            <xsl:call-template name="print-path">
                <xsl:with-param name="elm" select="$parent" />
                <xsl:with-param name="path" select="concat('/',$elm/@name,$path)" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="concat('/',$elm/@name,$path)" /><xsl:text>&#10;</xsl:text>            
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>
于 2012-05-08T19:40:27.870 に答える