1

XMLこれは私がデータベースに持っているサンプルです:

<Device>
    <Name>device1</Name>
    <Sensors>
        <Sensor>
            <Name>sensor1</Name>
        </Sensor>
        <Sensor>
            <Name>sensor2</Name>
        </Sensor>
</Device>

Field Range IndexDevice 親要素を使用して Name 要素を構築したいのですが、Sensor の Name 要素は構築したくありません。フィールド構成ルールに基づいて、フィールドに Name 要素を追加して Sensors 要素を除外することはできません。MarkLogic 5 に解決策はありますか? アプリの要件によると、ドキュメントを変換して要素名を変更することはできません。

4

2 に答える 2

2

簡単な答えは「いいえ」です。しかし、もちろん前進する方法はあります。

属性を追加できる場合 (ただし、要素名は変更しないでおく場合)、それによってフィールドを制約できます。たとえば、次のようになります。

<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.xslusingを適用できます。または、Information Studio フローでトランスフォーマーとしてxdmp:xslt-invoke()構成できます。annotate.xsl

元のドキュメントを取得したい場合は、次のように呼び出します。

xdmp:xslt-invoke("cleanup.xsl", doc("my-doc.xml"))

ただし、通常のアプリケーション コードのほとんどの場合、ドキュメントをクリーンアップする必要はありません。したがって、追加の属性の存在がそこに影響を与えることはめったにありません。

于 2011-11-18T23:03:09.413 に答える
1

Marklogic 6 の時点で、これはまさにパス範囲インデックスが解決するように設計された問題です。

http://developer.marklogic.com/blog/path-range-indexes

于 2013-05-20T23:49:34.813 に答える