2016-05-31 2 views
1

Я хочу фильтровать XML. Те, что я получаю, довольно большие, для меня много бесполезной информации.XSLT-фильтр XML, за исключением элементов certen

Мне просто нужно несколько элементов с текстом из этих файлов. Это почти то, на что это похоже.

<root> 
    <customerinfo1>...</customerinfo1> 
    <customerinfo2>...</customerinfo2> 
    <productinfo> 
    <productinfo1>...</productinfo1> 
    <productinfo2...></productinfo2> 
     <textarea> 
     <other1>...</other1> 
     <other2>...</other2> 
     <text1>abc</text1> 
     <text2>cab</text2> 
     <text3>bca</text3> 
     <other3>...</other3> 
     </textarea> 
    </productinfo> 
</root> 

Это почти то, на что оно похоже. Не все элементы имеют текст. Я хочу взять элементы с текстом в них и добавить их к одному элементу. Я хочу что-то подобное этому.

<placement> 
<text>Text from text1 text2 or text3</text> 
</placement> 

Какой XSLT я сделал и что он сделал. Так что мне удается сортировать его только с текстовыми элементами, но не группировать их по одному элементу. И большая проблема в том, что весь текст исчезает с <text>No text here</text>, и я получаю элементы, где пусто от начала в XML.

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

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="*[starts-with(name(),'text')]"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="node()|@*"> 
     <placement> 
      <text> 
      <xsl:apply-templates/> 
      </text> 
     </placement> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Вы можете точно показать, что результат должен выглядеть при обработке сводились пример источника, который вы дал в верхней части вашего вопроса? –

+0

Вы хотите сопоставить элемент 'root' с новым элементом' placement'? Или вы хотите сопоставить каждый элемент 'textarea' с новым элементом' placement'? И ваш желаемый выходной образец должен отображать данные из входного образца, который вы хотите вывести, в противном случае сложно сказать, чего вы хотите. Что касается вашего кода, если вы удалите первый шаблон и замените второй 'match = 'node() | @ *" 'на' match = "root" 'и' xsl: apply-templates /> 'в нем с'

+0

Okej, позвольте мне уточнить. Я хочу, чтобы 'textarea' чтобы стать 'placement' и' text1, text2, text3' стать одним ' Текст из text1, 2 и 3 здесь' – user2272544

ответ

1

Я хочу, чтобы текстовое поле, чтобы стать размещение и text1, text2, text3 к стать один <text>Text from text1, 2 and 3 here </text>

Как насчет:

XSLT 2,0

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

<xsl:template match="/"> 
    <placement> 
     <text> 
      <xsl:value-of select="//textarea/*[starts-with(name(),'text')]"/> 
     </text> 
    </placement> 
</xsl:template> 

</xsl:stylesheet> 

Применительно к вашему входному примеру (после коррекции <productinfo2..>), то результат будет:

<?xml version="1.0" encoding="UTF-8"?> 
<placement> 
    <text>abc cab bca</text> 
</placement> 
0

Спасибо. Это отлично работало с небольшим редактированием. Hade изменить выберите тег

<xsl:apply-templates select="//*[starts-with(name(),'text')]"/>

Текстовые элементы не в порядке больше, как это

<other1>...</other1> 
<text1>abc</text1> 
<other2>...</other2> 
<text2>cab</text2> 
<text3>bca</text3> 
<other3>...</other3> 
+0

'select =" // * [start-with (name(), 'text') ] «Это не очень хорошая идея, потому что она также выберет« textarea ». Я не вижу, что приказ имеет к этому отношение: элементы' other..' будут пропущены в любом случае. –

+0

Я действительно не знаю почему, но потом я выбираю // textarea/*, он только выбирает значение первых значений text1 abc not text2 и text3. Когда я пишу, как я сказал, я получаю значения всех трех, но не пробелы между dem. output "abccabbca" я хочу, чтобы вы писали «abc cab bca " – user2272544

+0

Вы уверены, что ваш процессор поддерживает XSLT 2.0? –

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