新元素下的XSLT Parse重复元素和Wrap输出

时间:2015-07-25 15:33:10

标签: xslt

我的XSLT中有以下代码行,我正在对ExtendedAttributes(重复元素)进行模板匹配并检查某些名称模式, 如果我的模式匹配,那么我需要获取该值并使用名为<Proxy> </Proxy>的元素进行换行。

     <xsl:for-each select="/OTF/Order/OrderHeader/ExtendedAttributes">
             <xsl:element name="Proxy">
                 <xsl:choose>
                     <xsl:when test="current()/Name = 'ProxyFNm'">
                         <xsl:element name="FirstName">
                             <xsl:value-of select="current()/Value"/>
                         </xsl:element>
                     </xsl:when>
                     <xsl:when test="current()/Name = 'ProxyLNm'">
                         <xsl:element name="LastName">
                             <xsl:value-of select="current()/Value"/>
                         </xsl:element>
                     </xsl:when>
                     <xsl:when test="current()/Name = 'ProxyContact#'">
                         <xsl:element name="Phone">
                             <xsl:value-of select="current()/Value"/>
                         </xsl:element>
                     </xsl:when>
                     <xsl:when test="current()/Name = 'ProxyEmailID'">
                         <xsl:element name="Email">
                             <xsl:value-of select="current()/Value"/>
                         </xsl:element>
                     </xsl:when>
                 </xsl:choose>
             </xsl:element>
         </xsl:for-each>  

输出:

  <Proxy>
     <FirstName>Rob</FirstName>
  </Proxy>
  <Proxy>
     <LastName>Johnson</LastName>
  </Proxy>
  <Proxy>
     <Email>hello@gmail.com</Email>
  </Proxy>
  <Proxy>
     <Phone>8000000000</Phone>
  </Proxy>

如果我将<xsl:element name="Proxy">移动到约 - 每个我得到我想要的输出并且事情是好的。

问题出在我的输入中,如果我没有匹配(<xsl:when test="current()/Name = 'ProxyFNm'">)那么它就是在创建我不想要的空元素<Proxy/>

有人可以建议我更好地处理这种情况吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您希望仅在符合条件的情况下才应用for-each,则需要将<xsl:for-each select="/OTF/Order/OrderHeader/ExtendedAttributes">替换为<xsl:for-each select="/OTF/Order/OrderHeader/ExtendedAttributes[Name = 'ProxyFNm' or Name = 'ProxyLNm' or Name = 'ProxyContact#' or Name = 'ProxyEmailID']">

我会将整个代码重构为模板,例如

<xsl:template match="ExtendedAttributes[Name = 'ProxyFNm']">
  <Proxy>
    <FirstName>
       <xsl:value-of select="Value"/>
    </FirstName>
  </Proxy>
</xsl:template>

(等等其他可能的Name值),然后您可以将for-each替换为<xsl:apply-templates select="/OTF/Order/OrderHeader/ExtendedAttributes[Name = 'ProxyFNm' or Name = 'ProxyLNm' or Name = 'ProxyContact#' or Name = 'ProxyEmailID']">

使用XSLT 2.0,条件Name = 'ProxyFNm' or Name = 'ProxyLNm' or Name = 'ProxyContact#' or Name = 'ProxyEmailID'可以表示为Name = ('ProxyFNm', 'ProxyLNm', 'ProxyContact#', 'ProxyEmailID')

将模板重组为

甚至可能更好
<xsl:template match="ExtendedAttributes">
  <Proxy>
    <xsl:apply-templates select="Name"/>
  </Proxy>
</xsl:template>

    <xsl:template match="ExtendedAttributes/Name[. = 'ProxyFNm']">
        <FirstName>
           <xsl:value-of select="../Value"/>
        </FirstName>
    </xsl:template>

当然为Name的其他值添加了类似的模板。