1

我有一个 XML 文件,其中包含非标准的 html 元素,如下所示: 注意:段落已被缩短。

                 <content>
                      Sacrifice. It's Mass Effect 3's major theme...
                      <p />
                      Mass Effect was about time and place; you d...
                      <p />
                      Mass Effect 3 is focused more on plot th...
                      <p />
                      <img url="me3_img1.jpg">Plenty of games feat...</img>
                      Like Star Wars, Mass Effect 3 is an inc...
                      <p />
                      The reapers aren't your only adver...
                      <p />
                      <img url="me3_img2.jpg">If looks could kill..</img>
                      The series' focus on player choice is as vi...
                      <p />
                      This intense narrative is met wi...
                      <p />
                      <img url="me3_img3.jpg">The sun is sett...</img>
                      These are exquis...
                 </content>

每个段落之间都会有一个空白。每个图像必须出现在它们出现在内容中的段落之间,还必须有一个标题,内容是介于两者之间的内容,还请注意,有一个 url 而不是 src,所以这必须改变。

我当前的 xslt 仅副本,并且 css 修复了布局,但 img 没有显示,因为我无法将 url 更改为 src,也无法设置标题。

请帮忙。

更新:

<xsl:for-each select='./review/content/child::*'>
                          <xsl:value-of select="name()"/>
                          <xsl:choose>
                            <xsl:when test="name()='p'">
                              <p />
                            </xsl:when>
                            <xsl:when test="name()='img'">
                              <div class="reviewImage">
                                <img>
                                  <xsl:attribute name="src">
                                    <xsl:value-of select="./@url"/>
                                  </xsl:attribute>
                                </img>
                                <xsl:value-of select="."/>
                              </div>                                
                            </xsl:when>
                            <xsl:otherwise>
                              <xsl:value-of select="."/>
                            </xsl:otherwise>
                          </xsl:choose>
                        </xsl:for-each>

它不输出任何文本()。图像和标题现在已排序。

找到的解决方案:

                       <xsl:for-each select='./review/content/node()'>
                          <xsl:choose>
                            <xsl:when test="name()='p'">
                              <p />
                            </xsl:when>
                            <xsl:when test="name()='img'">
                              <div class="reviewImage">
                                <img>
                                  <xsl:attribute name="src">
                                    <xsl:value-of select="./@url"/>
                                  </xsl:attribute>
                                </img>
                                <xsl:value-of select="."/>
                              </div>                                
                            </xsl:when>
                            <xsl:otherwise>
                              <xsl:value-of select="."/>
                            </xsl:otherwise>
                          </xsl:choose>
                        </xsl:for-each>
4

2 回答 2

1

当您想要复制某些内容并更改其中的一部分时,答案几乎总是将标识模板与其他模板一起使用。copy-of不能这样做,我尽量避免copy-of

以下是你如何做你描述的事情(当你说“标题”时,我不确定你的意思是alt还是title属性,所以我会同时使用:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="content/img">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:attribute name="alt">
        <xsl:value-of select="."/>
      </xsl:attribute>
      <xsl:attribute name="title">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="content/img/@url">
    <xsl:attribute name="src">
      <xsl:value-of select="." />
    </xsl:attribute>
   </xsl:template>
</xsl:stylesheet>

当这在您的示例输入上运行时,结果是:

<content>
  Sacrifice. It's Mass Effect 3's major theme...
  <p />
  Mass Effect was about time and place; you d...
  <p />
  Mass Effect 3 is focused more on plot th...
  <p />
  <img src="me3_img1.jpg" alt="Plenty of games feat..." title="Plenty of games feat..." />
  Like Star Wars, Mass Effect 3 is an inc...
  <p />
  The reapers aren't your only adver...
  <p />
  <img src="me3_img2.jpg" alt="If looks could kill.." title="If looks could kill.." />
  The series' focus on player choice is as vi...
  <p />
  This intense narrative is met wi...
  <p />
  <img src="me3_img3.jpg" alt="The sun is sett..." title="The sun is sett..." />
  These are exquis...
</content>
于 2013-05-19T13:47:09.337 回答
0

的要点copy-of是将内容从输入树复制到输出树。

为了在输入和输出树之间改变一些东西,你需要使用apply-templatesand template

如果你想在输出树上输出一个与输入树同名但内容不同的元素,你可以copy在你的模板中使用,并用适当的内容填充“副本”。

于 2013-05-19T11:43:46.610 回答