2016-09-02 3 views
0

Я хочу создать следующую структуру с XSL:Xsl, Xpath следующие отпрыски Еогеасп

<div class="helloclass">C 
<div class="hellomethod"><p>test</p></div> 
<div class="hellomethod"><p>test</p></div> 
</div> 
<div class="helloclass"> 
</div> 

У меня есть следующий XML:

<?xml version="1.0"?> 
    <hello id="C"></hello> 
    <hello id="M"></hello> 
    <hello id="M"></hello> 
    <hello id="C"></hello> 
</xml> 

С XSL и Xpath Я попытался следующие:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org"> 
    <xsl:template match="/"> 
    <xsl:for-each select="hello"> 
     <xsl:if test="current()[contains(@id,'C')]"> 
     <xsl:for-each select="following-sibling"> 
      <xsl:if test="current()[[email protected],'M']"> 
      <p>Test</p> 
      </xsl:if> 
     </xsl:for-each> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:styleshet> 

У меня есть структура xml. Для этого xml я хочу создать на основе структуры id.

ID = "C" означает, что он должен быть преобразован в < сНу класс = "helloclass" > ID = "M" означает, что он должен быть преобразован в < сНу класс = "hellomethod" >

Мои Первая цель - показать текст: «тест» в правильных узлах.

Также M должен быть вложен в C и не быть родным братом, как в xml.

Последовательности могут также отображаться: CMMCCMMMC, или CCCCCCCCCCMM, или CM, ... В принципе мне нужно «общее» решение.

XLST 1.0 Процессор доступен только.

+2

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

+0

Я попытался объяснить свою проблему. В основном у меня есть проблема с плоской структурой «xml». –

+0

Может быть две или более последовательностей, например. CMMCCMMMC на одном и том же входе? –

ответ

0

Хотя это было бы тривиальной задачей в XSLT 2.0, это далеко не тривиально, если оно должно выполняться процессором XSLT 1.0.

Рассмотрим следующий пример:

XML

<root> 
    <hello id="C">A</hello> 
    <hello id="M"></hello> 
    <hello id="M"></hello> 
    <hello id="C">B</hello> 
    <hello id="C">C</hello> 
    <hello id="M"></hello> 
    <hello id="M"></hello> 
    <hello id="M"></hello> 
    <hello id="C">D</hello> 
    <hello id="C">E</hello> 
</root> 

XSLT 1,0

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

<xsl:key name="method" match="hello[@id='M']" use="generate-id(preceding-sibling::hello[@id='C'][1])" /> 

<xsl:template match="/root"> 
    <body> 
     <xsl:for-each select="hello[@id='C']"> 
      <div class="helloclass"> 
       <xsl:value-of select="."/> 
       <xsl:for-each select="key('method', generate-id())"> 
        <div class="hellomethod"> 
         <p>test</p> 
        </div> 
       </xsl:for-each> 
      </div> 
     </xsl:for-each> 
    </body> 
</xsl:template> 

</xsl:stylesheet> 

Результат

<body> 
    <div class="helloclass">A 
     <div class="hellomethod"> 
     <p>test</p> 
     </div> 
     <div class="hellomethod"> 
     <p>test</p> 
     </div> 
    </div> 
    <div class="helloclass">B</div> 
    <div class="helloclass">C 
     <div class="hellomethod"> 
     <p>test</p> 
     </div> 
     <div class="hellomethod"> 
     <p>test</p> 
     </div> 
     <div class="hellomethod"> 
     <p>test</p> 
     </div> 
    </div> 
    <div class="helloclass">D</div> 
    <div class="helloclass">E</div> 
</body> 
+0

Большое спасибо за этот ответ. У вас есть какие-то ресурсы, где я могу узнать, что если у меня возникнет еще одна сложная проблема, я могу решить ее самостоятельно? –

+0

Я боюсь, что я не тот человек, на который я отвечаю. –

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