SQL Server 2008 R2 SQLXML и фильтр запросов xpath не работают - PullRequest
1 голос
/ 30 сентября 2011

У меня есть следующая схема, возвращающая четыре проекта при запуске sql xml:

<xsd:element name="iati-activities" sql:relation="IATI.ACTIVITIES" sql:key-fields="BUSINESS_UNIT">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="iati-activity" sql:relation="IATI.PROJECT_METADATA" sql:relationship="ACTIVITIES_ACTIVITY">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="ProjectId" type="xsd:string" sql:field="PROJECT_ID" sql:key-fields="PROJECT_ID" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  <xsd:complexType>
</xsd:element>

Я хочу получить:

<iati-activities>
  <iati-activity>
    <ProjectId>00072877</ProjectId>
  </iati-activity>
</iati-activities>

Но при запуске он не фильтруется. Вот xpath-запрос, который я использую:

<root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <sql:header sql:nullvalue="ISNULL">
    <sql:param name="ProjectId">00072877</sql:param>
  </sql:header>
  <sql:xpath-query mapping-schema="activity_schema.xsd">
    iati-activities[iati-activity/ProjectId=$ProjectId]
  </sql:xpath-query>
</root>

Вот что я получаю:

    <iati-activities>
      <iati-activity>
        <ProjectId>00072877</ProjectId>
      </iati-activity>
      <iati-activity>
        <ProjectId>00059626</ProjectId>
      </iati-activity>
      <iati-activity>
        <ProjectId>...</ProjectId>
      </iati-activity>
      <iati-activity>
        <ProjectId>...</ProjectId>
      </iati-activity>
    </iati-activities>

Если я использую следующий запрос:

<root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <sql:header sql:nullvalue="ISNULL">
    <sql:param name="ProjectId">00072877</sql:param>
  </sql:header>
  <sql:xpath-query mapping-schema="activity_schema.xsd">
    iati-activities/iati-activity[ProjectId=$ProjectId]
  </sql:xpath-query>
</root>

Я получаю следующее без элемента iati-acitivties:

<iati-activity>
  <ProjectId>00072877</ProjectId>
</iati-activity>

Кто-нибудь знает, что я делаю не так?

1 Ответ

1 голос
/ 03 октября 2011

Я знаю, что это ... Используемый мной xpath указывает только на элемент, и, выбрав его родительский элемент, я получаю все дерево под родительским узлом, а не только фильтрованный.* Он должен быть полностью экспортирован и применен xslt, где я определяю родительский элемент вручную.

<xsl:template match="/">
  <iati-activities version="1.01" GENERATED_DATE="{$GENERATED_DATE}">
    <xsl:for-each select="/iati-activities/iati-activity[ProjectId=$ProjectId]">
      <xsl:copy-of select="." />
    </xsl:for-each>
  </iati-activities>
</xsl:template>
...