2014-02-17 4 views
-1

Проблема: у меня есть атрибуты в двух разных местах. Я хочу использовать только 1 из этих мест на выходе. Поэтому мне нужно сопоставить (?) Соответствующий атрибут/ID с ElementAttributeID.Простое отображение и преобразование XPath (очень простое)

Это XML Я пытаюсь преобразовать:

<ID>Testdata</ID> 
<Attributes> 
    <Attribute> 
     <ID>Time</ID> 
     <Name>Time</Name> 
    </Attribute> 
    <Attribute> 
     <ID>Place</ID> 
     <Name>Place</Name> 
    </Attribute> 
    <Attribute> 
     <ID>Sense</ID> 
     <Name>Sense</Name> 
    </Attribute> 
</Attributes> 
<Elements> 
    <Element> 
     <ID>First</ID> 
     <Name>First</Name> 
     <MGs> 
      <MG> 
       <Attributes> 
        <Attribute> 
         <ElementAttributeID>Time</ElementAttributeID> 
        </Attribute> 
        <Attribute> 
         <ElementAttributeID>Place</ElementAttributeID> 
        </Attribute> 
       </Attributes> 
      </MG> 
     </MGs> 
    </Element> 
</Elements> 

мне удалось написать эту космическую часть XSL

<xsl:template match="MGs/MG/Attributes/Attribute"> 

    <xsl:for-each select="."> 
     <xsl:if test="./node() = parent::Attributes/Attribute"> 
      <xsl:value-of select="concat(CubeAttributeID,' Matches ',parent::Attributes/Attribute) " /> From template 
     </xsl:if> 
    </xsl:for-each> 

</xsl:template> 

После преобразования я обнаружил, что она отображается только найденное Атрибуты, но он не будет правильно отображаться в качестве выхода:

Time Matches Time 
Place Matches Time 

как желаемый ou tput будет:

Time Matches Time 
Place Matches Place 

Нужен ли мне один вложенный для каждого?

ответ

0

После недолгого чтения о том, как тестирование в XSL работает я получил это право. Не нужно сделать отображение, только одна переменная, которая используется в цикле Еогеасп:

<xsl:template match="/"> 
     <html> 
     <body> 
     <xsl:for-each select="/Elements/Element/MGs/MG/Attributes/Attribute"> 
      <xsl:variable name="id" select="ElementAttributeID" /> 
      <div> 
      <xsl:value-of select="concat(/Attributes/Attribute[ID=$id]/Name,'matches',/Elements/Element/MGs/MG/Attributes/Attribute/ElementAttributeID)"/> 
      </div> 
     </xsl:for-each> 
     </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

дает правильный результат:

Time matches Time 
Place matches Place 
0

Это не верно ..

вы соответствие шаблона и затем перекручивание каждого матча 1 за один раз! не удалить

<xsl:for-each select="." /> 

она по существу делает ничего в этом контексте, как вы выбираете элемент, который соответствует шаблону, так что вы в простых терминах сквозных вашего узел контекста.

Также, пожалуйста, обновите свой вопрос с предполагаемым выходом, и я уверен, что могу предоставить гораздо более подробную помощь!

Кроме того, пожалуйста, убедитесь, что ваш пример XSLT соответствует вашему Пример XML

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