将两个xsl文件的功能合并到一个文件中(继续我以前的Q的.....)

时间:2011-01-12 13:10:59

标签: xslt xslt-1.0 xslcompiledtransform

这是我之前的问题的继续(很抱歉再次发布类似的问题):

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.....)

这实际上是对我的第二个问题的一点操纵。 我现在需要将 Flack 提供的解决方案与我的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>

感谢您提前提供任何帮助。

1 个答案:

答案 0 :(得分: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>

注意:规则会覆盖身份规则。