2014-11-20 5 views
1

Я получилXSLT: XML в XML с вложенными атрибутами

<Level> 
    <Stage> 
     <Room id="1"> 
      <Door color="Brown" weight="5" check="true"/> 
     </Room> 
     <Room id="2"> 
      <Door color="Green" weight="7" check="false"/> 
     </Room> 
    </Stage> 
</Level> 

Но мне это нужно, чтобы преобразовать его в следующем формате с помощью XSLT

<Result> 
    <Listing> 
     <Room check="false"> 
      <Folder id="1" weight="5" color="Brown"/> 
     </Room> 
     <Room check="true"> 
      <Folder id="2" weight="7" color="Green"/> 
     </Room> 
    </Listing> 
</Result> 

Вопрос заключается в том, что комнатного идентификатор должен быть во вложенном дескрипторе элемента, в то время как вложенная проверка должна быть на уровне вверх. Возможно ли это с преобразованием XSLT? Как? Не могли бы вы привести пример?

+1

Можно ли предположить, что у каждого Рома есть ровно одна Дверь? (Если ответ «да», нужно задаться вопросом, зачем нужно вложить их, но это еще один вопрос ...). –

+0

Нет, несправедливо! – ServerSideCat

+0

В каком случае какая логика должна применяться для проекта 'Door/@ check' boolean для родительской« комнаты »- например, логическое для первого ребенка (предполагается, что оно имеет хотя бы один), или только если все дочерние атрибуты двери верны и т. д.? – StuartLC

ответ

0

Согласно комментарию @ michael, кажется, что ваш образец не является действительно репрезентативным (так как в нем могут быть несколько дверей), и вам также потребуется определить логику о том, как проецировать совокупное логическое представление всех дверей check указывает на родителя Room.

Вот пример отображения с множеством дверей, с логикой, что все двери должны быть check='true', чтобы для Room/@check, чтобы быть правдой:

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

    <xsl:template match="/Level"> 
     <Result> 
      <Listing> 
       <xsl:apply-templates select="Stage/Room"></xsl:apply-templates> 
      </Listing> 
     </Result>  
    </xsl:template> 

    <xsl:template match="Room"> 
     <Room check="{count(Door[@check='false']) = 0 and Door}"> 
      <xsl:apply-templates select="Door"></xsl:apply-templates> 
     </Room> 
    </xsl:template> 

    <xsl:template match="Door"> 
     <Folder id="{../@id}" weight="{@weight}" color="{@color}"/> 
    </xsl:template> 
</xsl:stylesheet> 

Входной Xml

<Level> 
    <Stage> 
     <Room id="1"> 
      <Door color="Brown" weight="5" check="true"/> 
      <Door color="Purple" weight="7" check="true"/> 
     </Room> 
     <Room id="2"> 
      <Door color="Green" weight="7" check="false"/> 
      <Door color="Orange" weight="4" check="true"/> 
     </Room> 
     <Room id="3"> 
     </Room> 
    </Stage> 
</Level> 

Выходные данные Xml

<?xml version="1.0" encoding="utf-8"?> 
<Result> 
    <Listing> 
    <Room check="true"> 
     <Folder id="1" weight="5" color="Brown" /> 
     <Folder id="1" weight="7" color="Purple" /> 
    </Room> 
    <Room check="false"> 
     <Folder id="2" weight="7" color="Green" /> 
     <Folder id="2" weight="4" color="Orange" /> 
    </Room> 
    <Room check="false" /> 
    </Listing> 
</Result> 
+0

Это правильно! Что делать, если дверей не будет - я мог бы поставить чек или вставить нуль/сообщение? – ServerSideCat

+0

Я добавил чек без детских дверей (и дверь будет правдой, если есть хотя бы один ребенок с дверью) – StuartLC

+0

Кроме того, если вы хотите полностью опустить Комнаты без дверей, измените шаблон apply на 'select = Stage/Room [Door] "' – StuartLC

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