2016-05-29 3 views
0

Я хочу использовать xslt для выбора некоторых наборов узлов с определенным значением в элементе из xml-файла. Я получаю нужный узел, но также получаю сериализованный текст из текстовых полей. Не могли бы вы помочь мне избавиться от этого текста?Почему текстовые узлы отображаются в преобразованном xml

Это исходный файл:

<surveys> 
<survey id='01'> 
    <category>cat1</category> 
    <questions> 
     <question id='1'>Y</question> 
     <question id='2'>Y</question> 
     <question id='3'>Y</question> 
     <question id='4'>Y</question> 
    </questions> 
</survey> 
<survey id='02'> 
    <category>cat2</category> 
    <questions> 
     <question id='1'>Y</question> 
     <question id='2'>Y</question> 
     <question id='3'>N</question> 
     <question id='4'>N</question> 
    </questions> 
</survey> 
<survey id='03'> 
    <category>cat1</category> 
    <questions> 
     <question id='1'>N</question> 
     <question id='2'>N</question> 
     <question id='3'>N</question> 
     <question id='4'>N</question> 
    </questions> 
</survey> 
<survey id='04'> 
    <category>cat3</category> 
    <questions> 
     <question id='1'>N</question> 
     <question id='2'>N</question> 
     <question id='3'>Y</question> 
     <question id='4'>Y</question> 
    </questions> 
</survey> 
</surveys> 

Это преобразование файла:

<?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" omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <surveys> 
     <category/> 
     <xsl:apply-templates/> 
    </surveys> 
</xsl:template> 

<xsl:template match="survey[category = 'cat2']"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

И это результат:

<surveys>cat1YYYY<survey id="02"> 
    <category>cat2</category> 
    <questions> 
     <question id="1">Y</question> 
     <question id="2">Y</question> 
     <question id="3">N</question> 
     <question id="4">N</question> 
    </questions> 
</survey>cat1NNNNcat3NNYY</surveys> 

Итак, я хотел бы получить избавиться от «cat1YYYY» в первой строке после элемента съемки и «cat1NNNNcat3NNYY» в последней строке после элемента съемки. И я хотел бы понять, почему это там ;-)

ответ

2

Я хотел бы понять, почему это там

Это там, потому что вы подаете шаблоны без разбора - и XSLT имеет некоторые built-in template rules, что копирование текстовых узлов по умолчанию.

Чтобы предотвратить это, вы можете добавить свой собственный шаблон, чтобы изменить поведение по умолчанию:

<xsl:template match="text()" /> 

или - предпочтительно - применять шаблоны выборочно начать с:

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

<xsl:template match="/surveys"> 
    <surveys> 
     <category/> 
     <xsl:apply-templates select="survey[category = 'cat2']"/> 
    </surveys> 
</xsl:template> 

<xsl:template match="survey"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

который КСТАТИ мог укоротить до:

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

<xsl:template match="/surveys"> 
    <surveys> 
     <category/> 
     <xsl:copy-of select="survey[category = 'cat2']"/> 
    </surveys> 
</xsl:template> 

</xsl:stylesheet> 
0

Вы можете отправить лишние text() узлы забвению путем добавления

<xsl:template match="text()" /> 

в таблице стилей.

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