如何使用XSLT从XML输出IMG标记

时间:2014-10-13 11:31:57

标签: asp.net xml xslt ektron

这是我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<Collection>
    <Content>
        <ID>2779</ID>
        <Type>Content</Type>
        <Title>Article One</Title>
        <QuickLink>/template.aspx?id=2779</QuickLink>
        <Teaser />
        <Html>
            <root>
                <NewsArticle>
                    <artTitle>The Comprehensive Breast Center: Quality Care on the Fast Track</artTitle>
                    <artThumb>
                        <img alt="Thumb Article One" src="/uploadedImages/Test/News/artOne.png?n=5954" />
                    </artThumb>
                    <artFull />
                    <releaseDate />
                    <contactName />
                    <contactPhone />
                    <contactEmail />
                    <artTeaser>The National Cancer Institute estimates that a woman in the United States has a 1 in 8 chance of developing invasive breast cancer</artTeaser>
                    <artText>
                        <p>The Comprehensive Breast Center: Quality Care on 
the Fast Track</p>
                        <p>

如何使用XSLT

将上述XML中的IMG标记显示为HTML文档

2 个答案:

答案 0 :(得分:1)

这样的事情可以解决问题:

<xsl:template match="/">
  <xsl:for-each select="Collection/Content">
    <xsl:copy-of select="Html/root/NewsArticle/artThumb/node()"/>
  </xsl:for-each>
</xsl:template>

我应该注意,这假设你是从Ektron系列中得到这个 - 根据你对这个问题的标记做出的假设。这将显示集合中每个内容块的图像。如果您只想要集合的第一个内容块中的图像,则可以删除for-each,而是使用以下内容:

<xsl:template match="/">
  <xsl:copy-of select="Collection/Content/Html/root/NewsArticle/artThumb/node()"/>
</xsl:template>

此外,它可以正常工作,但我从for-each上的select前面删除了斜杠。由于代码位于已经匹配“/".

的模板中,因此看似多余

更新

其中一些可以在工作区完成 - 它允许你设置css类,虽然我不确定你是否可以设置图像的title属性。以下是通过XSLT实现这一目标的方法。在这种情况下,您无法复制整个销售节点:

<xsl:template match="/">
  <xsl:for-each select="Collection/Content">
    <xsl:variable name="imageSrc" select="Html/root/NewsArticle/artThumb/img/@src" />
    <xsl:variable name="imageId">
      <xsl:text>NewsArticle_</xsl:text>
      <xsl:value-of select="ID" />
      <xsl:text>_image</xsl:text>
    </xsl:variable>
    <xsl:variable name="contentTitle" select="Html/root/NewsArticle/artTitle" />

    <img id="{ $imageId }" class="myCssClass" title="{ $contentTitle }" alt="{ $contentTitle }" src="{ $imageSrc }" />
  </xsl:for-each>
</xsl:template>

(再次更新 - 看来我误解了你的评论。谢谢,@MathiasMüller!) 在为这样的元素分配id时,我更喜欢使用不仅仅是内容id。在这种情况下,通过使用“NewsArticle_ {Content ID} image”,我允许容器div使用id“NewsArticle {Content Id}”,如果将来需要它而不会与图片ID。

答案 1 :(得分:1)

  

如何从artTitle以及类和id分配标题和alt?

在@BrianOliver给出的答案的基础上,这就是如何输出img元素,其“title”属性反映了输入XML中artTitle的内容 - {{1} }。

我假设“来自artTitle的alt”是指ID的文字内容也应来自img/@alt元素。

artTitle

但是,我不确定<xsl:template match="/"> <xsl:for-each select="Collection/Content"> <xsl:variable name="imageSrc" select="Html/root/NewsArticle/artThumb/img/@src" /> <!--xsl:variable name="imageAlt" select="Html/root/NewsArticle/artThumb/img/@alt" /--> <xsl:variable name="imageId" select="ID"/> <xsl:variable name="imageTitle" select="Html/root/NewsArticle/artTitle"/> <img id="{$imageId}" class="myCssClass" title="{$imageTitle}" alt="{ $imageTitle}" src="{$imageSrc}"/> </xsl:for-each> </xsl:template> 属性应该来自何处。