如何在XML CDATA中添加属性? XSLT

时间:2012-12-18 03:06:20

标签: xml xslt

XML:

<Frames>

<bannerFrame1>
      <![CDATA[
      <iframe src="https://image.domain.com/promobanner1.html" height="320" width="629"                scrolling="no" frameborder="0" marginwidth="0" marginheight="0"></iframe>
      ]]>
    </bannerFrame1>

<bannerFrame2>
      <![CDATA[
      <iframe src="https://image.domain.com/promobanner2.html" height="320" width="629"                scrolling="no" frameborder="0" marginwidth="0" marginheight="0"></iframe>
      ]]>
    </bannerFrame2>

</Frames>

XML:bannerFrame1 / iframe CDATA source值可能看起来像这样

<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
     <body>
       <div>
        <img src="banners/banner1.gif" border="0" alt="Banner"/>
       </div>
     </body>
  </html>

XSLT:我得到了bannerFrame1的CDATA值

<xsl:template match="/">
    <xsl:value-of select="Frames/bannerFrame1" disable-output-escaping="yes" />
 </xsl:template>

我尝试在CDATA“bannerFrame1”的图片上添加Google分析事件跟踪代码。 如何在获取CDATA值<img src="banners/banner1.gif" border="0" alt="Banner">时在<bannerFrame1>上添加onclick属性?真的有可能吗?提前谢谢。

Expected output: 
 <iframe>
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
         <body>
           <div>
            <img src="banners/banner1.gif" border="0" alt="Banner" onclick ="GoogleEventTracker();"/>
           </div>
         </body>
      </html>
</iframe>

iframe来源:

<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="Pragma" content="no-cache">
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <link rel="stylesheet" type="text/css" href="css/ui-lightness/jquery-ui-1.7.2.custom.css">
    <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
    <script type="text/javascript" src="custombanner/jquery.min.js"> </script>
    <script type="text/javascript" src="custombanner/jquery.cycle.all.2.74.js"></script>
    <script type="text/javascript" src="js/jquery-ui-1.7.2.custom.min.js"></script>
    <!--<script type="text/javascript" src="js/custom.js"></script>-->
    <title>domain - It's time everyone flies</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta name="script" http-equiv="Content-Script-Type" content="text/javascript">
    <meta name="script" http-equiv="Content-Style-Type" content="text/css">
    <!--<script type="text/javascript" src="js/soapclient.js"></script>-->
    <style type="text/css">
        img, div, a, input
        {
            behavior: url(iepngfix.htc);
        }
        #nav
        {
            float: left;
            left: 8px;
            margin: 15px;
            position: absolute;
            top: 235px;
            padding-left: 242px; /* for 4 frames */ /*padding-left: 278px; /* for 3 frames */ /*padding-left: 312px; /* for 2 frames */ /*padding-left: 242px; /* for 4 frames */
            margin-left: 1px;
            margin-right: 1px;
            margin-bottom: 1px;
            height: 40px; /*background :url("banners/gradient.gif") repeat-x scroll 0 0 transparent;*/
        }
        #nav li
        {
            display: block;
            float: left;
            list-style: none outside none;
            margin: 2px;
            padding: 2px;
            padding-right: 4px;
            margin-top: 8px;
            width: 25px;
        }
        #nav a
        {
            border: 1px solid #ffffff;
            display: block;
            padding: 0;
            width: 25px;
        }
        #nav img
        {
            border: medium none;
            display: block;
            height: 20px;
            width: 25px;
            opacity: 0.5;
            filter: alpha(opacity=50);
        }
        #nav li.activeLI
        {
            background: #ff0000;
        }
        #nav li.activeLI img
        {
            opacity: 1;
            filter: alpha(opacity=100);
        }
    </style>
</head>
<body marginwidth="0" marginheight="0">
    <div class="hero">
        <div class="slideshow mainpromo" id="slideshow" style="margin-bottom: 50px;">
<!--            <a href="http://www.domain.com/Pages/SeatSalePromo.aspx" target="_top">
                <img src="banners/banner1.gif" border="0" alt="Banner" /></a>-->
            <img src="banners/banner1.gif" border="0" alt="Banner">
        </div>
        <ul id="nav">
        </ul>
        <div class="rightpane">
            <!--<a href="http://www.domain.com" target="_top"><img src="banners/promo-fares.jpg" width="206" height="214" border="0" alt="Thumbnail" /></a>-->
            <img src="banners/lite-fares.jpg" width="206" height="214" border="0" alt="Thumbnail">
            <a href="https://book.domain.com/Register.aspx" target="_top"><img src="images/registernow.gif" width="203" height="20" border="0" alt="See all Low Fares"></a>  
            <!--<center><a href="http://www.domain.com/Pages/WebCheck-in.aspx" target="_top"><font size="2" color="#ff6600">Web Check-In</font></a></center>-->
          <!--<a href="http://domain.com" target="_blank"><img src="images/topdestinatios_btn.gif" alt="" width="149" height="26" border="0" /></a>-->
        </div>
        <div id="alerts">
            <p>
                <strong>Seat Sale Alert! </strong>Be the first to know thePromos. <a target="_top" href="http://www.domain.com/pages/emms-signup.aspx">SUBSCRIBE NOW »</a>
            </p>
            <p>
                <!--                <strong>Seat Sale Availability</strong> Find the best time to travel. <a target="_top"
                    href="http://www.domain.com/documents/seat_map.pdf">DOWNLOAD PDF &raquo;</a>-->
            </p>
            <div class="clear">
            </div>
        </div>
        <div style="clear: both;">
        </div>
        <div id="mascot">
            <img src="images/mascot.png" alt="">
        </div>
        <div style="clear: both;">
        </div>
    </div>


</body></html>

1 个答案:

答案 0 :(得分:0)

如果你控制image.domain.com,那么你可以毫无困难地添加该属性,但是你不需要这种循环方法来实现。如果你不控制image.domain.com,那你就不走运了。 (至少,我虔诚地希望如此。)

如果我已正确理解您的问题,您就会问如何使用XSLT将其他服务器提供的数据更改为XSLT样式表输出中的iframe内容。 XSLT很难这样做,因为在您的示例中,数据是由浏览器从image.domain.com获取的,作用于样式表的输出,而不是样式表。如果浏览器中运行的样式表试图直接检索数据并将其插入输出文档而不是iframe,则浏览器会阻止该尝试违反同源策略。

我印象深刻 - 我以为我永远不会对同源政策说一句好话,或者觉得它有任何有用的目的,但你证明我错了。

在服务器上运行的样式表可能能够解析bannerFrame1的足够字符串值,以识别指向的URI,获取数据,并将其插入输出中代替iframe。让它正确显示可能具有挑战性。

或者您可以将iframe指向image.domain.com而不是您自己的服务器上的代理,该代理从image.domain.com获取数据,插入您的跟踪属性,并将修改后的数据交给浏览器。 (克服同源策略的标准方法:在进入途中从您自己的服务器上退回数据。同源策略不会阻止所有人包含来自其他来源的数据,只有那些无法设置代理的人。)