2011-01-12 5 views
0

Это в продолжении моих предыдущих вопросов (извините за повторную проводку подобного типа вопроса еще раз):Слияния двух XSL-файлов в один файл (продолжение моего предыдущего Q-х .....)

Merge functionality of two xsl files into a single file (not a xsl import or include issue)

и

Merge functionality of two xsl files into a single file (continued.....)

Это на самом деле немного манипуляция мой второй вопрос. я теперь нужно объединить решение, предоставляемое Флэк на мой первый вопрос с «выбрать» условие в моем XSL:

<xsl:choose> 
      <xsl:when test='/Declaration/Header/DeclarantsReference = ""'> 
      <DeclarantsReference> 
       <xsl:text disable-output-escaping="no">A</xsl:text> 
      </DeclarantsReference> 
      </xsl:when> 
      <xsl:otherwise> 
      <DeclarantsReference> 
       <xsl:value-of select="/Declaration/Header/DeclarantsReference"/> 
      </DeclarantsReference> 
      </xsl:otherwise> 
     </xsl:choose> 

Теперь любой входной образец XML, как:

<Declaration> 
     <Message> 
      <Meduim>#+#</Meduim> 
      <CommonAccessReference></CommonAccessReference> 
     </Message> 
     <BeginingOfMessage> 
      <MessageCode>5</MessageCode> 
      <DeclarationCurrency></DeclarationCurrency> 
      <MessageFunction>ISD</MessageFunction> 
     </BeginingOfMessage> 
     <Header> 
      <DeclarantsReference></DeclarantsReference> 
      <Items> 
      <Documents> 
        <ItemDocument> 
        <DocumentCode>XXX</DocumentCode> 
        <DocumentPart></DocumentPart> 
        <DocumentLanguage>#+#</DocumentLanguage> 
        </ItemDocument> 
       </Documents> 
      </Items> 
      </Header> 
</Declaration> 

должен выходной :

<Declaration> 
<Message> 
    <Meduim></Meduim> 
</Message> 
<BeginingOfMessage> 
    <MessageCode>5</MessageCode> 
    <MessageFunction>ISD</MessageFunction> 
</BeginingOfMessage> 
<Header> 
<DeclarantsReference>A</DeclarantsReference> 
    <Items> 
    <Documents> 
    <ItemDocument> 
    <DocumentCode>XXX</DocumentCode> 
    <DocumentLanguage></DocumentLanguage> 
    </ItemDocument> 
    </Documents> 
    </Items> 
</Header> 
</Declaration> 

Благодарим за любую помощь заранее.

+0

Поскольку вы не выбрали правильное решение (конвейерная обработка), вы (и будете постоянно в будущем) сталкиваться с новыми проблемами. Ваш код будет все больше и больше иметь спагетти, как внешний вид и ремонтопригодность будет постоянно ухудшаться. Не поздно возвращаться и возвращаться к решениям конвейерной обработки, которые были предоставлены вам ранее. Пусть это будет хорошим уроком. –

+0

@ Dimitre: Трубопровод был неправильным решением. Здесь мы имеем некоторые правила, перезаписывающие правило идентичности. –

+1

@Alejandro: Тогда этот ОП страдает от неспособности объяснить свою проблему понятным образом. Очевидно, он использует неправильный стиль кодирования, но он не предоставил полный пример, поэтому не может помочь, предлагая решение в лучшем стиле кодирования ... –

ответ

0

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="*[not(node())]"/> 
    <xsl:template match="text()" name="strip"> 
     <xsl:param name="pString" select="."/> 
     <xsl:param name="pOutput" select="substring-before($pString,'#+#')"/> 
     <xsl:choose> 
      <xsl:when test="contains($pString,'#+#')"> 
       <xsl:call-template name="strip"> 
        <xsl:with-param name="pString" 
            select="substring-after($pString,'#+#')"/> 
        <xsl:with-param name="pOutput" 
            select="concat($pOutput, 
                substring-before($pString, 
                    '#+#'))"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="concat($pOutput,$pString)"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
    <xsl:template match="DeclarantsReference[not(node())]" 
        priority="1"> 
     <xsl:copy>A</xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Выход:

<Declaration> 
    <Message> 
     <Meduim></Meduim> 
    </Message> 
    <BeginingOfMessage> 
     <MessageCode>5</MessageCode> 
     <MessageFunction>ISD</MessageFunction> 
    </BeginingOfMessage> 
    <Header> 
     <DeclarantsReference>A</DeclarantsReference> 
     <Items> 
      <Documents> 
       <ItemDocument> 
        <DocumentCode>XXX</DocumentCode> 
        <DocumentLanguage></DocumentLanguage> 
       </ItemDocument> 
      </Documents> 
     </Items> 
    </Header> 
</Declaration> 

Примечание: Правила перезаписи правила идентичности.