1

次のような非標準の html 要素を含む XML ファイルがあります。 注: 段落は短縮されています。

                 <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>

それぞれが段落間のギャップになります。各画像は、コンテンツに表示される段落の間に表示する必要があります。また、キャプションも必要です。コンテンツは と の間にあります。 には src ではなく URL があることに注意してください。したがって、これを変更する必要があります。

私の現在の xslt のみのコピーと css はレイアウトを修正しますが、URL を src に変更したり、キャプションを設定したりできないため、img は表示されません。

助けてください。

アップデート:

<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>

text() を出力していません。ただし、画像とキャプションは現在ソートされています。

見つかった解決策:

                       <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

何かをコピーしてその一部を変更したい場合の答えは、ほとんどの場合、ID テンプレートと追加のテンプレートを使用することです。copy-ofこれはできないので、できる限り避けcopy-ofます。

あなたが説明したことを行う方法は次のとおりです(「キャプション」と言うとき、それが意味するものなのalttitle属性を意味するのかわかりませんので、両方を使用します:

<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-templatestemplateます。

入力ツリーと同じ名前で出力ツリーに要素を出力したいが、内容が異なる場合copyは、テンプレートで使用して、適切な内容で「コピー」を埋めることができます。

于 2013-05-19T11:43:46.610 に答える