2015-02-03 3 views
0
<Records count="1"> 
    <Metadata> 
    <FieldDefinitions> 
     <FieldDefinition id="25675" name="GrandpaID" alias="GrandpaID" /> 
     <FieldDefinition id="123" name="Father ID" alias="FatherID" /> 
     <FieldDefinition id="1923" name="Son ID" alias="SonID" /> 
    </FieldDefinitions> 
    </Metadata> 
    <LevelCounts> 
    <LevelCount id="1" count="2" /> 
    <LevelCount id="2" count="2" /> 
    <LevelCount id="3" count="3" /> 
    </LevelCounts> 
    <Record contentId="578859" levelId="1" moduleId="648" parentId="0"> 
    <Record contentId="138286" levelId="2" moduleId="68" parentId="0"> 
     <Record contentId="107826" levelId="3" moduleId="152" parentId="0"> 
     <Field id="1923" type="1">Grandson Record 1</Field> 
     </Record> 
     <Record contentId="107830" levelId="3" moduleId="152" parentId="0"> 
     <Field id="1923" type="1">Grandson Record 2</Field> 
     </Record> 
     <Field id="123" type="1">Son Record</Field> 
    </Record> 
    <Field id="25675" type="6">Grandpa Record</Field> 
    </Record> 
</Records> 

У меня есть вышеупомянутый XML. Что мне нужно сделать, так это посмотреть на каждую «Grandson Record» и создать запись для каждого. То есть, для каждого Внукового Реестра, найденного под Дедушкой/Сыном, мне нужен Дедушка/Сын/Внук 1 и второй для Дедушки/Сына/Внука 2. У меня есть следующий XSLT, который дает мне оба Grandson Records в то же время ,XSL Transform - несколько дочерних узлов = множественные отношения

XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:variable name ="fields" select="//Metadata/FieldDefinitions" /> 

    <!--match the root node--> 
    <xsl:template match="Records"> 
    <ArcherRecords > 
     <xsl:apply-templates select="Record" /> 
    </ArcherRecords> 
    </xsl:template> 

    <!-- match child relationships --> 
    <xsl:template match="Record"> 
    <xsl:variable name="fieldName" select="translate(@levelId, ': ', '__')" /> 
    <xsl:element name="Relationship_{$fieldName}"> 
     <xsl:apply-templates select="@contentId" /> 
     <xsl:apply-templates select="Field" /> 
     <xsl:apply-templates select="Record" /> 
    </xsl:element> 
    </xsl:template> 

    <!--get field name--> 
    <xsl:template name="getName"> 
    <xsl:param name="fieldId" /> 

    <xsl:choose> 
     <xsl:when test="$fields/FieldDefinition[@id=$fieldId]">   
     <xsl:value-of select="$fields/FieldDefinition[@id=$fieldId]/@alias"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="'Field_'"/> 
     <xsl:value-of select="translate(@id, ': ', '__')" /> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

Результат:

<?xml version="1.0" encoding="UTF-8"?> 
<ArcherRecords xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Relationship_1> 
     <Field_contentId>578859</Field_contentId> 
     <GrandpaID>Grandpa Record</GrandpaID> 
     <Relationship_2> 
     <Field_contentId>138286</Field_contentId> 
     <FatherID>Son Record</FatherID> 
     <Relationship_3> 
      <Field_contentId>107826</Field_contentId> 
      <SonID>Grandson Record 1</SonID> 
     </Relationship_3> 
     <Relationship_3> 
      <Field_contentId>107830</Field_contentId> 
      <SonID>Grandson Record 2</SonID> 
     </Relationship_3> 
     </Relationship_2> 
    </Relationship_1> 
</ArcherRecords> 

Желаемый результат:

<?xml version="1.0" encoding="UTF-8"?> 
<ArcherRecords xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Relationship_1> 
     <Field_contentId>578859</Field_contentId> 
     <GrandpaID>Grandpa Record</GrandpaID> 
     <Relationship_2> 
     <Field_contentId>138286</Field_contentId> 
     <FatherID>Son Record</FatherID> 
     <Relationship_3> 
      <Field_contentId>107826</Field_contentId> 
      <SonID>Grandson Record 1</SonID> 
     </Relationship_3> 
     </Relationship_2> 
    </Relationship_1> 
    <Relationship_1> 
     <Field_contentId>578859</Field_contentId> 
     <GrandpaID>Grandpa Record</GrandpaID> 
     <Relationship_2> 
     <Field_contentId>138286</Field_contentId> 
     <FatherID>Son Record</FatherID>  
      <Relationship_3> 
       <Field_contentId>107830</Field_contentId> 
       <SonID>Grandson Record 2</SonID> 
     </Relationship_3> 
     </Relationship_2> 
    </Relationship_1> 
</ArcherRecords> 

Любая помощь будет принята с благодарностью!

+1

Что известно и что является примером? Например: три уровня в глубину - может ли быть больше? + Я спросил вас раньше о родительских идентификаторах - вы уверены, что они верны? –

+0

Три уровня настолько глубоки, насколько это будет. Извините, было предложено создать новый вопрос. Я верю, что parentID корректны, они исходят из атрибута contentID в Record. – user1772421

+0

"* Я верю, что родительский идентификатор верен, они исходят из атрибута contentID в записи. *« Я ожидаю, что запись, у которойIDID = 138286, имеет parentId = 578859. И так далее. –

ответ

1

Я, вероятно, что-то здесь не вижу, потому что я не понимаю, почему это должно быть так сложно. Я считаю, что следующая таблица стилей будет возвращать требуемый результат, для входа с любым количеством уровней:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="fieldDefinition" match="FieldDefinition" use="@id" /> 

<xsl:template match="/Records"> 
    <ArcherRecords> 
     <!-- for each leaf node --> 
     <xsl:for-each select=".//Record[not(Record)]"> 
      <!-- replicate the tree, starting from the top --> 
      <xsl:apply-templates select="ancestor::Record[last()]"> 
       <xsl:with-param name="leafId" select="@contentId"/> 
      </xsl:apply-templates> 
     </xsl:for-each> 
    </ArcherRecords> 
</xsl:template>  

<xsl:template match="Record"> 
    <xsl:param name="leafId"/> 
    <xsl:element name="Relationship_{@levelId}"> 
     <!-- deal with the current level --> 
     <Field_contentId> 
      <xsl:value-of select="@contentId" /> 
     </Field_contentId> 
     <xsl:element name="{key('fieldDefinition', Field/@id)/@alias}"> 
      <xsl:value-of select="Field" /> 
     </xsl:element> 
     <!-- continue to the next lower level, branching to current leaf node only --> 
     <xsl:apply-templates select="Record[descendant-or-self::Record/@contentId=$leafId]"> 
      <xsl:with-param name="leafId" select="$leafId"/> 
     </xsl:apply-templates> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

Обратите внимание, что мы предполагаем, что каждый Record имеет уникальный @contentId значение.

+0

Майкл - спасибо за ответ. Теперь у меня другая проблема. Мне нужен идентификатор дедушки или дедушка (я могу объяснить вам мой сценарий, поскольку я понимаю, что вы не понимаете, почему это так сложно), чтобы каждый раз быть другим. Это означает, что это может быть счетчик, где он может увеличить ID контента на 1, поскольку это, вероятно, проще. – user1772421

Смежные вопросы