簡単な答えは「いいえ」です。しかし、もちろん前進する方法はあります。
属性を追加できる場合 (ただし、要素名は変更しないでおく場合)、それによってフィールドを制約できます。たとえば、次のようになります。
<Device>
<Name _field="DeviceName">device1</Name>
...
</Device>
属性と値のペアは、何でもかまいません。フィールド定義にそれが何であるかを伝えるだけです。良い習慣は属性にあるかもしれないnamespace-qualify
ので、それは明らかに別の語彙からの注釈です。
<Device xmlns:field="http://example.com/field-annotations">
<Name field:name="DeviceName">device1</Name>
...
</Device>
範囲インデックスは現在、要素値、属性値、およびフィールド値にのみ関連付けることができます。フィールドを使用すると、基礎となる構造を少し抽象化できますが、より一般的なメカニズムほどではありません。
時々採用される別のテクニック (個人的には試したことはありませんが) は、2 つのデータベースを使用することdatabase-optimized
です。
どのアプローチを決定するにしても、もう少し作業が必要です。
私があなただったら、XSLT
入力に適用できる変換と、必要に応じて元の注釈なしのバージョンを返すための別の単純な変換を作成するでしょう。
annotate.xsl:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:field="http://example.com/field-annotations">
<xsl:import href="copy.xsl"/>
<!-- Annotate Device/Name as a field -->
<xsl:template mode="add-att" match="Device/Name">
<xsl:attribute name="field:name" select="'DeviceName'"/>
</xsl:template>
</xsl:stylesheet>
クリーンアップ.xsl:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:field="http://example.com/field-annotations">
<xsl:import href="copy.xsl"/>
<!-- Delete all field:* attributes -->
<xsl:template match="@field:*"/>
</xsl:stylesheet>
コピー.xsl:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Don't add any attributes by default -->
<xsl:template mode="add-att" match="*"/>
<!-- recursively copy elements -->
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates mode="add-att" select="."/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- copy attributes and child nodes -->
<xsl:template match="@* | text() | comment() | processing-instruction()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
ドキュメントをデータベースに挿入するために、アプリケーション コードでannotate.xsl
usingを適用できます。または、Information Studio フローでトランスフォーマーとしてxdmp:xslt-invoke()
構成できます。annotate.xsl
元のドキュメントを取得したい場合は、次のように呼び出します。
xdmp:xslt-invoke("cleanup.xsl", doc("my-doc.xml"))
ただし、通常のアプリケーション コードのほとんどの場合、ドキュメントをクリーンアップする必要はありません。したがって、追加の属性の存在がそこに影響を与えることはめったにありません。