Проблемы преобразования XML EntityObject с помощью XSLT - PullRequest
1 голос
/ 09 сентября 2009

У меня есть документ XML, который я генерирую из объекта Entity Framework. Сгенерированный XML выглядит так:

ПЕРЕПИСАНО ПОЛНЫЙ XML

<Task z:Id="i1" xmlns="http://schemas.datacontract.org/2004/07/MCC.DAL" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
  <EntityKey z:Id="i2" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" 
             xmlns:a="http://schemas.datacontract.org/2004/07/System.Data">
    <a:EntityContainerName>Editorial_MasterEntities</a:EntityContainerName>
    <a:EntityKeyValues>
      <a:EntityKeyMember>
        <a:Key>TaskID</a:Key>
        <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">1670</a:Value>
      </a:EntityKeyMember>
    </a:EntityKeyValues>
    <a:EntitySetName>Task</a:EntitySetName>
  </EntityKey>
  <FormCOIAns i:nil="true" />
  <FormCOIAnsReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
    <a:EntityKey i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
  </FormCOIAnsReference>
  <FormCrownLicAns z:Id="i3">
    <EntityKey z:Id="i4" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data">
      <a:EntityContainerName>Editorial_MasterEntities</a:EntityContainerName>
      <a:EntityKeyValues>
        <a:EntityKeyMember>
          <a:Key>TaskID</a:Key>
          <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">1670</a:Value>
        </a:EntityKeyMember>
      </a:EntityKeyValues>
      <a:EntitySetName>FormCrownLicAns</a:EntitySetName>
    </EntityKey>
    <CrownAgreement>1</CrownAgreement>
    <GovernmentAgency>ASDSADSADSADSA</GovernmentAgency>
    <Task z:Ref="i1" />
    <TaskID>1670</TaskID>
    <TaskReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
      <a:EntityKey z:Ref="i2" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
    </TaskReference>
  </FormCrownLicAns>
  <FormCrownLicAnsReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
    <a:EntityKey z:Ref="i4" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
  </FormCrownLicAnsReference>
  <FormStdLicAns i:nil="true" />
  <FormStdLicAnsReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
    <a:EntityKey i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
  </FormStdLicAnsReference>
  <FormType i:nil="true" />
  <FormTypeReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
    <a:EntityKey z:Id="i5" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data">
      <b:EntityContainerName>Editorial_MasterEntities</b:EntityContainerName>
      <b:EntityKeyValues>
        <b:EntityKeyMember>
          <b:Key>FormType_ID</b:Key>
          <b:Value i:type="c:int" xmlns:c="http://www.w3.org/2001/XMLSchema">3</b:Value>
        </b:EntityKeyMember>
      </b:EntityKeyValues>
      <b:EntitySetName>FormType</b:EntitySetName>
    </a:EntityKey>
  </FormTypeReference>
  <LastModified i:nil="true" />
  <Manuscript z:Id="i6">
    <EntityKey z:Id="i7" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data">
      <a:EntityContainerName>Editorial_MasterEntities</a:EntityContainerName>
      <a:EntityKeyValues>
        <a:EntityKeyMember>
          <a:Key>ManuscriptID</a:Key>
          <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">3000004</a:Value>
        </a:EntityKeyMember>
        <a:EntityKeyMember>
          <a:Key>PubID</a:Key>
          <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">3</a:Value>
        </a:EntityKeyMember>
      </a:EntityKeyValues>
      <a:EntitySetName>Manuscript</a:EntitySetName>
    </EntityKey>
    <Editor i:nil="true" />
    <EditorReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
      <a:EntityKey z:Id="i8" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data">
        <b:EntityContainerName>Editorial_MasterEntities</b:EntityContainerName>
        <b:EntityKeyValues>
          <b:EntityKeyMember>
            <b:Key>EditorID</b:Key>
            <b:Value i:type="c:int" xmlns:c="http://www.w3.org/2001/XMLSchema">3</b:Value>
          </b:EntityKeyMember>
        </b:EntityKeyValues>
        <b:EntitySetName>Editor</b:EntitySetName>
      </a:EntityKey>
    </EditorReference>
    <ManuscriptID>3000004</ManuscriptID>
    <ManuscriptStatus i:nil="true" />
    <ManuscriptStatusReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
      <a:EntityKey i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
    </ManuscriptStatusReference>
    <PubID>3</PubID>
    <Publication i:nil="true" />
    <PublicationReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
      <a:EntityKey z:Id="i9" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data">
        <b:EntityContainerName>Editorial_MasterEntities</b:EntityContainerName>
        <b:EntityKeyValues>
          <b:EntityKeyMember>
            <b:Key>PubID</b:Key>
            <b:Value i:type="c:int" xmlns:c="http://www.w3.org/2001/XMLSchema">3</b:Value>
          </b:EntityKeyMember>
        </b:EntityKeyValues>
        <b:EntitySetName>Publication</b:EntitySetName>
      </a:EntityKey>
    </PublicationReference>
    <Task>
      <Task z:Ref="i1" />
    </Task>
    <Title>test</Title>
  </Manuscript>
  <ManuscriptReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
    <a:EntityKey z:Ref="i7" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
  </ManuscriptReference>
  <MasterPerson z:Id="i10">
    <EntityKey z:Id="i11" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data">
      <a:EntityContainerName>Editorial_MasterEntities</a:EntityContainerName>
      <a:EntityKeyValues>
        <a:EntityKeyMember>
          <a:Key>MPID</a:Key>
          <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">1380007</a:Value>
        </a:EntityKeyMember>
      </a:EntityKeyValues>
      <a:EntitySetName>MasterPerson</a:EntitySetName>
    </EntityKey>
    <Comments i:nil="true" />
    <Created>2008-01-08T14:14:01.867</Created>
    <Do_Not_Use>false</Do_Not_Use>
    <Editor />
    <FName>tony</FName>
    <LName>kim</LName>
    <MName />
    <MPGUID>C6C28CFFD41A4106B3FDB4CFBBF79B63</MPGUID>
    <MPID>1380007</MPID>
    <Prefix i:nil="true" />
    <Suffix i:nil="true" />
    <Task>
      <Task z:Ref="i1" />
    </Task>
    <Updated>2008-01-08T14:14:01.867</Updated>
  </MasterPerson>
  <MasterPersonReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
    <a:EntityKey z:Ref="i11" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
  </MasterPersonReference>
  <TaskID>1670</TaskID>
  <TaskStatus z:Id="i12">
    <EntityKey z:Id="i13" xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" xmlns:a="http://schemas.datacontract.org/2004/07/System.Data">
      <a:EntityContainerName>Editorial_MasterEntities</a:EntityContainerName>
      <a:EntityKeyValues>
        <a:EntityKeyMember>
          <a:Key>TaskStatusID</a:Key>
          <a:Value i:type="b:int" xmlns:b="http://www.w3.org/2001/XMLSchema">3</a:Value>
        </a:EntityKeyMember>
      </a:EntityKeyValues>
      <a:EntitySetName>TaskStatus</a:EntitySetName>
    </EntityKey>
    <Description>Completed</Description>
    <Task>
      <Task z:Ref="i1" />
    </Task>
    <TaskStatusID>3</TaskStatusID>
  </TaskStatus>
  <TaskStatusReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
    <a:EntityKey z:Ref="i13" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
  </TaskStatusReference>
</Task>

Это была таблица стилей, которая работала вчера, но, очевидно, что-то изменилось в моем XML - вы можете увидеть компы с локальным именем и XPath.

    <?xml version='1.0'?>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"
      xmlns:c="http://www.w3.org/2001/XMLSchema"
      xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"
      xmlns:b="http://schemas.datacontract.org/2004/07/System.Data"
      xmlns="http://schemas.datacontract.org/2004/07/MCC.DAL">
      <!--xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses" -->

      <xsl:template match="/*">
        <DIV STYLE="font-weight:bold">
          Local name:<xsl:value-of select="/*[local-name()='Task']/*[local-name()='MasterPerson']/*[local-name()='FName']" /><br />
          XPath:<xsl:value-of select="/Task/MasterPerson/FName"/>
        </DIV>
      </xsl:template>
    </xsl:stylesheet>

Проблема, с которой я сталкиваюсь при перечислении пространств имен, заключается в том, что некоторые из них перекрываются в зависимости от контекста уровня тега, что может стать причиной проблемы. Очевидно, вчера я использовал другой исходный XML (argh) или просто другой набор объектов. (В любом случае, если источник меняется, он не должен взрывать XSLT, как это.)

Сейчас я вынужден использовать подход local-name (), но на самом деле хотел бы выяснить это.

1 Ответ

2 голосов
/ 09 сентября 2009

Ориентировочно ... Извините, у меня нет времени, чтобы проверить, работает ли следующее ...

РЕДАКТИРОВАТЬ (заканчивая после долгого рабочего дня ...) Да! Это было правильно. в строке совпадения с шаблоном отсутствует только *, который должен быть "/ *", а не просто "/"

Это нормально с XML-файлом, скопированным из вопроса ОП (с необходимыми правками, поскольку образец XML вопроса является фрагментарным). Внимание, однако! Использование уловки * [local-name () = 'xyz'] для игнорирования пространств имен следует сохранить для быстрых тестов, прочитайте после фрагмента кода предпочтительный способ обработки этих пространств имен XML.

  <xsl:template match="/">
    <DIV STYLE="font-weight:bold">
      <xsl:value-of select="*[local-name()='Task']/*[local-name()='MasterPerson']/*[local-name()='FName']" />
    </DIV>
  </xsl:template>

XPath и пространства имен

Модель данных XPath обрабатывает документ XML как дерево узлов, таких как узлы элемента, атрибута и текста, где имя каждого узла является комбинацией его локального имени и имени пространства имен. Интересно, что XPath работает с пространством имен по умолчанию непоследовательным образом, и поэтому никто не замечает всю эту проблему xmlns до тех пор, пока элементы, нацеленные на XSL, не будут принадлежать полностью определенным именованным элементам во входном XML. 1018 * ссылка для более подробной информации.

Столкнувшись с вводом XML, содержащим элементы, указанные в xmlns, разработчик сценариев XSL должен либо обеспечить полную квалификацию имен своих целевых узлов (предпочтительный подход), либо использовать трюк local-name (), показанный выше, чтобы инструктировать XPath игнорировать пространства имен. Чтобы использовать имена с префиксом xmlns, короткий префикс может быть определен как обычно, а затем он может использоваться логикой XSL следующим образом. (фактический xmlns может быть неправильным, так как пример XML-файла неполон)

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:t="http://schemas.datacontract.org/2004/07/MCC.DAL">

 <xsl:template match="/MyRoot">
    <DIV STYLE="font-weight:bold">
      <xsl:value-of select="t:Task/i:MasterPerson/i:FName" />
    </DIV>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...