如何避免从XSLT生成的重复项

时间:2016-01-15 23:13:49

标签: xml xslt xsd xslt-1.0 xslt-2.0

我的xslt文件中的每个循环都有一个,它会处理多个条件,如果任何条件具有匹配的情况,我想退出循环并给出第一个值(已满足我的输出。

这是我的xml文件

     <Product>
     <ContactDetails>
     <addressdetail>
     <Street>Stack</Street>
     <HouseNumber>123</HouseNumber>
     </addressdetail>
     <addressdetail>
     <Street>Stack</Street>
     <HouseNumber>123456</HouseNumber>
     </addressdetail>
     <addressdetail>
     <Street>Stack</Street>
     <HouseNumber>456</HouseNumber>
     </addressdetail>
     </ContactDetails>
     </Product> 

在我的XSL文件中,我有一些这样的kinding

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                 version="2.0" xmlns:fo="http://www.w3.org/1999/XSL/Format"                 xmlns:saxon="http://saxon.sf.net/" extension-element-prefixes="saxon">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">     
        <p1:product_req>
         <p2:Contactdetails_Req>
        <xsl:for-each select ="Product[ContactDetails= 'addressdetails']  ">
            <xsl:if test="Street='Stack'" >
            <p3:SC>abc</p3:SC>
            </xsl:if>
         </xsl:for-each>
         </p2:Contactdetails_Req> 
     </p1:product_req>

 </xsl:template>
</xsl:stylesheet>     

转换后,我的输出xml上有三个值

          <p1:Product_Req>
            <p2:ContactDetails_Req>   
            <p3:ac>abc</p3:ac>
            <p3:ac>abc</p3:ac>
            <p3:ac>abc</p3:ac>
            </p1:Product_Req>
            </p2:ContactDetails_Req>  

但我不需要输出xml上的重复值,我只需要在我的Xml节点ac上有一个值。我尝试过使用身份变换,但似乎没有任何工作,任何帮助都非常感激

<p1:Product_Req>
<p2:ContactDetails_Req>    
<p3:ac>abc</p3:ac>
</p1:Product_Req>
</p2:ContactDetails_Req>  

我需要获得我的转换输出而没有任何重复。

1 个答案:

答案 0 :(得分:1)

你的问题不明确。如果 - 看起来 - 你想测试至少一个地址(在整个XML中)是否具有给定的街道,你可以简单地做:

<xsl:template match="/">
    <xsl:if test="Product/ContactDetails/addressdetail/Street='Stack'" >
            <!-- whatever you want to output goes here -->
    </xsl:if>
</xsl:template>