2012-05-17 3 views
1
<To> 
    <Id>SERVICE</Id> 
    <Role>Commuter</Role> 
</To> 
<BPD> 
    <OrgNo>234</OrgNo>  
</BPD> 
<BON>123</BON> 

У меня есть этот входной XML, в котором я хочу проверить, содержит ли //To/Id SERVICE или нет. Если он содержит СЕРВИС, то после <BPD> необходимо добавить элемент, называя <BON>SERVICE</BON>. Также я хочу проверить, содержит ли мой входной XML <BON> элемент, тогда его значение должно быть заменено на SERVICE, которое находится в элементе <Id>.Коррекция шаблона в XSLT

Я создал шаблон для этого ->

<xsl:template match="BPD"> 
<xsl:choose> 
    <xsl:when test="not(BON) and normalize-space(/To[Role='Commuter']/Id)='SERVICE'"> 
    <BON> 
    <xsl:text>SERVICE</xsl:text> 
    </BON> 
    </xsl:when>   
    <xsl:when test="normalize-space(BON) and normalize-space(/To[Role='Commuter']/Id)='SERVICE'"> 
     <BON> 
    <xsl:text>SERVICE</xsl:text> 
     </BON> 
    </xsl:when> 
</xsl:choose> 
</xsl:template> 

Этот шаблон проверки существует ли или нет. Если он не существует, он создает <BON> элемент и добавляет к нему значение «SERVICE». И если существует, то он создает еще один элемент, который не требуется. Мне нужно исправить мою вторую ситуацию.

+0

Вы пытаетесь заменить существующие ng '' или добавить к нему? –

+0

Оба варианта. 1) IF не существует, затем добавьте его, и значение должно быть SERVICE. 2) IF существует, тогда его значение должно быть заменено SERVICE. – Kundan

ответ

2

Если вы только что заменили существующий <BON>, если он exis кт, вы должны только это:

<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()|@*" name="ident"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="BPD[../To[Role='Commuter']/Id='SERVICE']"> 
    <xsl:call-template name="ident"/> 
    <BON>SERVICE</BON> 
    </xsl:template> 

    <xsl:template match="BON[../To[Role='Commuter']/Id='SERVICE']"/> 

</xsl:stylesheet> 

С либо этого входом:

<doc> 
    <To> 
    <Id>SERVICE</Id> 
    <Role>Commuter</Role> 
    </To> 
    <BPD> 
    <OrgNo>234</OrgNo>  
    </BPD> 
    <BON>123</BON> 
</doc> 

или этот вход (без <BON>)

<doc> 
    <To> 
    <Id>SERVICE</Id> 
    <Role>Commuter</Role> 
    </To> 
    <BPD> 
    <OrgNo>234</OrgNo>  
    </BPD> 
</doc> 

будет производить этот вывод:

<doc> 
    <To> 
     <Id>SERVICE</Id> 
     <Role>Commuter</Role> 
    </To> 
    <BPD> 
     <OrgNo>234</OrgNo> 
    </BPD> 
    <BON>SERVICE</BON> 
</doc> 
+0

+1 за хороший ответ. –

0

Я думаю, что вы говорите, что это то, что если у вас есть To элемент с идентификатором из «SERVICE» и Роль из «Commuter», то вы хотите, чтобы убедиться, есть следующий BON элемент со значением «СЕРВИС» (заменяет любой существующий, если он уже существует).

Это может быть сделано без использования xsl: выберите, но два отдельных соответствующих шаблона. Во-первых, вы можете сопоставить случай, когда у вас есть элемент BON, а предыдущие элементы предназначены для «Пригородных» и «СЕРВИС».

<xsl:template match="BON[preceding-sibling::To[Role='Commuter'][normalize-space(Id)='SERVICE']]"> 

Тогда вы можете иметь шаблон, соответствующий BPD элемента, где нет никакого BON элемента вообще.

Вот полный XSLT

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

    <xsl:template match="BON[preceding-sibling::To[Role='Commuter'][normalize-space(Id)='SERVICE']]" name="bon"> 
     <BON>SERVICE</BON> 
    </xsl:template> 

    <xsl:template match="BPD[preceding-sibling::To[Role='Commuter'][normalize-space(Id)='SERVICE']][not(following-sibling::BON)]"> 
     <xsl:call-template name="identity" /> 
     <xsl:call-template name="bon" /> 
    </xsl:template> 

    <xsl:template match="@*|node()" name="identity"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Обратите внимание на использование именованных шаблонов, чтобы избежать дублирования кодирование элемента BON.

При нанесении на следующий XML

<Root> 
    <To> 
     <Id>SERVICE</Id> 
     <Role>Commuter</Role> 
    </To> 
    <BPD> 
     <OrgNo>234</OrgNo> 
    </BPD> 
    <BON>123</BON> 
</Root> 

Ниже выводится

<Root> 
    <To> 
     <Id>SERVICE</Id> 
     <Role>Commuter</Role> 
    </To> 
    <BPD> 
     <OrgNo>234</OrgNo> 
    </BPD> 
    <BON>SERVICE</BON> 
</Root> 

Если вы изменили входной XML к следующему, то он также будет давать один и тот же выход в данном случае

<Root> 
    <To> 
     <Id>SERVICE</Id> 
     <Role>Commuter</Role> 
    </To> 
    <BPD> 
     <OrgNo>234</OrgNo> 
    </BPD> 
</Root> 
Смежные вопросы