2013-10-11 3 views
0

Пытается переместить сразу дочерние элементы из корневых элементов, а затем скопировать их под новый корневой элемент. Способный сделать это один дочерний элемент, но не уверен, как применить or с в select.
Current XSLT для рекурсивного дочернего элемента:XSLT: не включая более одного дочернего элемента при применении шаблона

<xsl:template match="Element1"> 
    <Information> 
     <xsl:apply-templates select="*[name()!='Element1']"/> 
    </Information> 
    <xsl:apply-templates select="Element1"/> 
    </xsl:template> 
    <xsl:template match="Element1/Element1"> 
    <Metadata> 
     <xsl:apply-templates/> 
    </Metadata> 
    </xsl:template> 

Я хочу, чтобы применить то же самое для другого дочернего элемента и попытался

<xsl:template match="Element1"> 
    <Information> 
     <xsl:apply-templates select="*[name()!='Element1'] | *[name()!='Element2']"/> 
    </Information> 
    <xsl:apply-templates select="Element1"/> 
    </xsl:template> 
    <xsl:template match="Element1/Element1"> 
    <Metadata> 
     <xsl:apply-templates/> 
    </Metadata> 
    </xsl:template> 

    <xsl:template match="Element1/Element2"> 
    <Metadata2> 
     <xsl:apply-templates/> 
    </Metadata2> 
    </xsl:template> 

Но это не сработало. Пожалуйста помоги.

ответ

1

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

<xsl:apply-templates select="*" mode="metadata"/> 

активировать группу, а затем определить шаблоны в группе

<xsl:template match="*" mode="metadata"/> 
<xsl:template match="Element1" mode="metadata"> 
    ... 
<xsl:template> 
<xsl:template match="Element2" mode="metadata"> 
    ... 
<xsl:template> 

для блоков метаданных.


Используя режим, ваш шаблон будет выглядеть примерно так:

<xsl:template match="Element1"> 
    <Information> 
    <!-- use templates in the information group --> 
    <xsl:apply-templates select="*" mode="metadata"/> 
    </Information> 
    <xsl:apply-templates select="Element1"/> 
</xsl:template> 

<!-- This template removes unspecified elements --> 
<xsl:template match="*" mode="metadata"/> 

<xsl:template match="Element1" mode="metadata"> 
    <Metadata> 
    <xsl:apply-templates/> 
    </Metadata> 
</xsl:template> 

<xsl:template match="Element2" mode="metadata"> 
    <Metadata2> 
    <xsl:apply-templates/> 
    </Metadata2> 
</xsl:template> 

Вы, вероятно, некоторые другие шаблоны, определяющие содержание <Metadata/> и <Metadata2/>. Вероятно, они тоже будут в режиме.

+0

Где бы я использовал группу в xslt, упомянутом в вопросе? –

+1

Вы имеете в виду 'mode'? Я не думаю, что 'group' является допустимым атрибутом на' xsl: template' или 'xsl: apply-templates'. –

+0

Да, режим. Обслуживает меня правильно, чтобы ответить на вопрос с моего iPad и не запускать его, хотя процессор. –

0
<xsl:apply-templates select="*[name()!='Element1'] | *[name()!='Element2']"/> 

... всегда верно для element1 и ELEMENT2 - вы не можете цепи два = выражения вместе, как, что, поскольку выражение будет вычисляться верно для всего.

Вы можете просто сопоставить пути Element1/Element1 и Element1/Element2 с шаблонами, которые ничего не выводят - тогда вам не нужно иметь сложную логику в выражении apply-templates внутри.

Затем вызовите именованный шаблон (а не используя совпадение) из вашего корня, чтобы вывести элемент Element1/Element1, куда вы хотите его запустить.

+0

К сожалению, код не отображался: выражение * [name()! = 'Element1'] | * [name()! = 'Element2'] оценивается как true для всех имен элементов. – Agnes

+0

Но он отлично работает только для '* [name()! = 'Element1']', но когда я даю '* [name()! = 'Element1'] | * [name()! = 'Element2'] 'он включает' Element2' –

+1

Поскольку Element2! = Element1. Итак, первая половина или ваше выражение оценивают true. – Agnes

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