2015-06-11 2 views
0

Я вообще не разбираюсь в XML/XSLT. Я просто пытаюсь научиться достаточно, чтобы преобразовать этот XML-файл в то, что может использовать моя база данных Access. XML-данные были выведены в формате атрибута, а Access - только формат элемента. У меня основные преобразования вниз, но я не могу представить элементарные вложенные данные.Как преобразовать XSLT XML вложенные атрибутные элементы и имя конкатенации

Я хотел бы, чтобы конечным результатом были все элементы. В настоящий момент мой XSLT-скрипт пытается включить атрибут родительского имени в имя дочернего элемента, но это может и не понадобиться. Было бы замечательно, если бы у меня были элементы списка, пронумерованные в их именах. Например, «AuthorList1», «AuthorList2» или «Author1», «Author2».

Вот вроде XML, что я имею дело с (сокращенно):

XML

<Result> 
<DocSum> 
<Id>25587056</Id> 
<Item Name="PubDate" Type="Date">2015 Jan 13</Item> 
<Item Name="EPubDate" Type="Date">2015 Jan 13</Item> 
<Item Name="Source" Type="String">Invest Ophthalmol Vis Sci</Item> 
<Item Name="AuthorList" Type="List"> 
    <Item Name="Author" Type="String">Wang Q</Item> 
    <Item Name="Author" Type="String">Tuten WS</Item> 
    <Item Name="Author" Type="String">Lujan BJ</Item> 
</Item> 
<Item Name="Title" Type="String">Adaptive optics microperimetry</Item> 
<Item Name="Volume" Type="String">56</Item> 
<Item Name="ArticleIds" Type="List"> 
    <Item Name="pubmed" Type="String">25587056</Item> 
    <Item Name="pii" Type="String">iovs.14-15576</Item> 
    <Item Name="doi" Type="String">10.1167/iovs.14-15576</Item> 
</Item> 
<Item Name="References" Type="List"></Item> 
<Item Name="HasAbstract" Type="Integer">1</Item> 
</DocSum> 
</Result 

Я получил довольно далеко с XSLT, но я не все путь там. Одной из проблем, которая продолжает возникать, является то, что пустые элементы (например, ссылки) получают пустые имена, которые недопустимы. Это произошло, когда я попытался выполнить команду, используя шаблон соответствия «Item [@ Type =« List »]». Кроме того, я не могу заставить дочерние узлы (элементы?) Списков стать их собственными элементами.

XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="@*" > 
    <xsl:element name="{name()}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Item"> 
    <xsl:element name="{@Name}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="child::Item"> 
    <xsl:variable name="Parent" select="TEST"/> 
     <xsl:element name="{$Parent}{@Name}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

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

ответ

0

Один вопрос у вас есть шаблон, который соответствует Item

<xsl:template match="Item"> 
    <xsl:element name="{@Name}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

Используя xsl:value-of здесь, он не будет продолжать обработку всех дочерних узлов, так что вы не будете получать согласование делается на любого ребенка Item элементы , Вы должны использовать xsl:apply-templates здесь, чтобы шаблоны применять к детям

<xsl:template match="Item"> 
    <xsl:element name="{@Name}"> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

Другой вопрос с другим шаблоном, который соответствует child::Item. Я думаю, что это также будет соответствовать родительским элементам Item, так что имеет тот же приоритет, что и другой шаблон Item. Вы, вероятно, нужно заменить матч с этим:

<xsl:template match="Item[@Type='List']/Item"> 

Наконец, вы определяете переменную Parent в этом шаблоне следующим образом:

<xsl:variable name="Parent" select="TEST"/> 

Это установит Parent к значению элемента с именем TEST, когда, возможно, вам нужно только буквальное значение «Тест». Таким образом, вы должны определить это как так

<xsl:variable name="Parent" select="'TEST'"/> 

Попробуйте XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="@*" > 
    <xsl:element name="{name()}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Item"> 
    <xsl:element name="{@Name}"> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="Item[@Type='List']/Item"> 
    <xsl:variable name="Parent" select="'TEST'"/> 
     <xsl:element name="{$Parent}{@Name}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 
+0

Это так очень полезно! Я тестировал всю конкатенацию имени. Спасибо за помощь. – Lauren

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