XSL копирует нежелательное значение узла при вызове шаблонов - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть XML, и мне нужно применить 2 преобразования ко всем узлам.

<?xml version="1.0" encoding="UTF-8"?>
  <root>
    <a> V1 </a>
    <b> noo </b>
    <a> v2</a>
    <a> v3</a>
    <b>noo</b>
    <a> v4</a>
    <a> v5</a>
    <a> v6</a>
  </root>

Эти 2 преобразования должны быть выполнены последовательно: сначала все "first_transformation", затем все "second_transformaiton" .

Я использовал этот xsl:

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">        
        <xsl:output method='xml' version='1.0' encoding="UTF-8" indent="yes"/>   
        <xsl:template match="/*">
            <xsl:apply-templates mode="t1"/>     
           <xsl:apply-templates mode="t2"/>       
        </xsl:template>   

        <xsl:template match="//a" mode="t1" > 
           <xsl:element name="first_transformation">
               <xsl:value-of select="current()"/>

           </xsl:element>                 
        </xsl:template>

        <xsl:template match="//a" mode="t2" > 
            <xsl:element name="second_transformation">
                <xsl:value-of select="current()"/>

            </xsl:element>                 
        </xsl:template>

    </xsl:stylesheet>

Как видите, я использую два шаблона для каждого преобразования, и я называю их в "основном" шаблоне.

Мой результат:

<?xml version="1.0" encoding="UTF-8"?>
    <first_transformation> V1 </first_transformation>
     noo 
    <first_transformation> v2</first_transformation>
    <first_transformation> v3</first_transformation>
    noo
    <first_transformation> v4</first_transformation>
    <first_transformation> v5</first_transformation>
    <first_transformation> v6</first_transformation>
    <second_transformation> V1 </second_transformation>
     noo 
    <second_transformation> v2</second_transformation>
    <second_transformation> v3</second_transformation>
    noo
    <second_transformation> v4</second_transformation>
    <second_transformation> v5</second_transformation>
    <second_transformation> v6</second_transformation>

Как вы видите, у меня есть эти значения "noo" из узлов b, которые хранят копии.

Вы знаете, как я могу заставить их исчезнуть из моего выхода? Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Или просто:

<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="/*">
    <xsl:apply-templates select="a" mode="t1"/>     
    <xsl:apply-templates select="a" mode="t2"/>       
</xsl:template>   

<xsl:template match="a" mode="t1" > 
    <first_transformation>
        <xsl:value-of select="."/>
    </first_transformation>                 
</xsl:template>

<xsl:template match="a" mode="t2" > 
    <second_transformation>
        <xsl:value-of select="."/>
    </second_transformation>                 
</xsl:template>

</xsl:stylesheet>

Обратите внимание, что результатом является фрагмент XML, поскольку он не имеет элемента root.

0 голосов
/ 21 апреля 2020

Встроенные правила шаблона по умолчанию копируют text() узлы ( ссылка ):

Встроенное правило для любого элемента заключается в обработке его дочерних элементов и текстовые узлы.

Таким образом, вы должны переопределить это поведение для каждого режима.
Поэтому добавьте эти два шаблона в вашу таблицу стилей:

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

Это удалит все лишнее " noo "text() узлов.

...