2016-10-17 2 views
2

Я получаю эту ошибку, пока я пытаюсь поставить XPath в соответствие. Что я делаю неправильно? Это мой пример XMLMatch XPath create Ошибка загрузки таблиц стилей: не удалось изменить таблицу стилей XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="test.xsl"?> 
<ROOT> 
    <DOCUMENT name="HLSSD"> 
    <TAG1 name="t1"> 
     text0 
     <ELEM1 id="el1"> 
     text1 
     </ELEM1> 
     <MYELEMENT/> 
     <ELEM2 id="el2"> 
     text2 
     <ELEM2 id="el3"> 
     text3 
     </ELEM2> 
     <MYELEMENT/> 
     <ELEM1 id="el4"> 
     text4 
     </ELEM1> 
     <MYELEMENT/> 
     text4.5 
     <ELEM1 id="el5"> 
     text5 
     </ELEM1> 
     <TAG3 name="t2"/> 
     text5.6 
     <ELEM2 id="el6"> 
     text6 
     </ELEM2> 
     </ELEM2> 
     </TAG1> 
    <TAG1 name="t3"> 
     <ELEM1 id="el7"> 
     text7 
     </ELEM1> 
     <ELEM2 id="el8"> 
     text3 
     </ELEM2> 
     <MYELEMENT/> 
     <ELEM1 id="el9"> 
     text4 
     </ELEM1> 
     <MYELEMENT/> 
     text4.5 
     <ELEM1 id="el10"> 
     text5 
     </ELEM1> 
     <TAG3 name="t4"/> 
     text5.6 
     <ELEM2 id="el11"> 
     text6 
     </ELEM2> 
    </TAG1> 
    <TAG2 name="t4"> 
    </TAG2> 
    <TAG2 name="t5"> 
    </TAG2> 
    <TAG1 name="t6"> 
    </TAG1> 
    </DOCUMENT> 
</ROOT> 

Вот мой XSL код:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html"/> 
<xsl:template match="/"> 
<html> 
<body><xsl:apply-templates/></body> 
</html> 
</xsl:template> 
<xsl:template match="DOCUMENT"> 
    <div> 
    <h1><xsl:value-of select="@name" /></h1> 
    <xsl:apply-templates/> 
    </div> 
</xsl:template> 
<xsl:template match="TAG1|TAG2|TAG3"> 
<div> 
    <h1><xsl:value-of select="name()" /></h1> 
    <p><xsl:value-of select="@name" /></p> 
    <pre><xsl:apply-templates/></pre> 
    </div> 
</xsl:template> 
<xsl:template match="ELEM1|ELEM2"> 
    <p>(<xsl:apply-templates/>)</p> 
</xsl:template> 
<xsl:template match="MYELEMENT/following-sibling::*[count(.|(TAG1|TAG2|TAG3|MYELEMENT)/preceding-sibling::*)=count((TAG1|TAG2|TAG3|MYELEMENT)/preceding-sibling::*)]"> 
<div> 
    <h1><xsl:value-of select="name()" /></h1> 
    <p><xsl:apply-templates/></p> 
</div> 
</xsl:template> 
</xsl:stylesheet> 

То, что я хочу, чтобы найти MyElement и все после того, как на том же уровне до первого (одного) из TAG1 или tag2 или TAG3 или MYELEMENT или быть конкретным. Я хочу обернуть тегом div каждый элемент от MYELEMENT до первого из TAG1 или TAG2 или TAG3 или MYELEMENT на том же уровне или в конце родительского элемента.

Вывод должен быть таким:

<html> 
<body> 
<div> 
<h1>DocName</h1> 
    <div> 
    <h1>TAG1</h1> 
    <p>t1</p> 
    <pre> 
     text0 
     <p>(
     text1 
    )</p> 
     **<DIV>** 
     **<H1>MYELEMENT</H1>** 
     <p>(
     text2 
     <p>(
     text3 
     )</p> 
     **<DIV>** 
     **<H1>MYELEMENT</H1>** 
     <p>(
     text4 
     )</p> 
     **</DIV>** 
     **<DIV>** 
     <H1>MYELEMENT</H1> 
     text4.5 
     <p>(
     text5 
     )</p> 
     **</DIV>** 
     <div> 
     <h1>TAG3</h1> 
     <p>t2</p> 
     <pre></pre> 
     </div> 
     text5.6 
     <p>(
     text6 
     )</p> 
    )</p> 
     **</DIV>** 
     </pre> 
    </div> 
    <div> 
    <h1>TAG1</h1> 
    <p>t3</p> 
    <pre> 
     <p>(
     text7 
    )</p> 
     <p>(
     text3 
     )</p> 
     **<DIV>** 
     **<H1>MYELEMENT</H1>** 
     <p>(
     text4 
     )</p> 
     **</DIV>** 
     **<DIV>** 
     **<H1>MYELEMENT</H1>** 
     text4.5 
     <p>(
     text5 
     )</p> 
     **</DIV>** 
     <div> 
     <h1>TAG3</h1> 
     <p>t4</p> 
     <pre></pre> 
     </div> 
     text5.6 
     <p>(
     text6 
    )</p> 
    </pre> 
    </div> 
    <div> 
    <h1>TAG2</h1> 
    <p>t5</p> 
    <pre> 
    </pre> 
    </div> 
    <div> 
    <h1>TAG2</h1> 
    <p>t6</p> 
    <pre> 
    </pre> 
    </div> 
    <div> 
    <h1>TAG1</h1> 
    <p>t7</p> 
    <pre> 
    </pre> 
    </div> 
</div> 
</body> 
</html> 
+0

Что касается причины ошибки см HTTPS : //www.w3.org/TR/xslt#patterns о шаблонах XSLT: «Путь пути местоположения - это путь местоположения, в шагах которого используются только оси дочернего элемента или атрибута». Таким образом, вы не можете использовать шаблон, как у вас, с шагом, используя 'next-sibling :: *'. –

+0

Хорошо, но это тоже не работает :( zelenooq

ответ

0

Вы можете изменить свой match пути правильного пути с тем же смысловым значением, как это:

<xsl:template match="*[preceding-sibling::MYELEMENT and 
    count(.|(TAG1|TAG2|TAG3|MYELEMENT)/preceding-sibling::*) = 
    count((TAG1|TAG2|TAG3|MYELEMENT)/preceding-sibling::*)]"> 
+0

Не работает:

AAAAA BBBB

zelenooq

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