使用XSLT检查子节点中是否有任何img标记

时间:2012-11-27 14:56:03

标签: xml xslt

目前我正致力于使用XSLT将QTI转换为XHTML。

我有一个可能有一些html标签的标签。目前在以下示例中,我有以下QTI xml

<?xml version="1.0" encoding="utf-8"?>
<assessmentItem xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p1 http://www.imsglobal.org/xsd/imsqti_v2p1.xsd" identifier="choice" title="Item Title will come here" adaptive="false" timeDependent="false" xmlns="http://www.imsglobal.org/xsd/imsqti_v2p1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <responseDeclaration identifier="RESPONSE" cardinality="single" baseType="identifier">
    <correctResponse>
      <value>D</value>
    </correctResponse>
  </responseDeclaration>
  <outcomeDeclaration identifier="SCORE" cardinality="single" baseType="integer">
    <defaultValue>
      <value>0</value>
    </defaultValue>
  </outcomeDeclaration>
  <itemBody>
    <div id="item">
      <choiceInteraction responseIdentifier="RESPONSE" shuffle="false" maxChoices="1">
        <prompt>Question text appears here?</prompt>
        <simpleChoice identifier="A">
          <img src="a.gif" height="75px" width="75px" id="img0" alt=""></img>
        </simpleChoice>
        <simpleChoice identifier="B">
          <img src="b.gif" height="75px" width="75px" id="img1" alt=""></img>
        </simpleChoice>
        <simpleChoice identifier="C">
          <img src="c.gif" height="75px" width="75px" id="img2" alt=""></img>
        </simpleChoice>
        <simpleChoice identifier="D">
          <img src="d.gif" height="75px" width="75px" id="img3" alt=""></img>
        </simpleChoice>
        <simpleChoice identifier="E">
          <img src="e.gif" height="75px" width="75px" id="img4" alt=""></img>
        </simpleChoice>
      </choiceInteraction>
    </div>
  </itemBody>
  <responseProcessing template="http://www.imsglobal.org/question/qti_v2p1/rptemplates/match_correct" />
</assessmentItem>

我想检查simpleChoice标记是否有任何img标记作为子节点,然后我想将样式添加到<div class='content'>输出标记,如下所示,如果simpleChoice标记没有img标记作为子节点我想将样式属性跳到<div class='content'>输出标记。

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  </head>
  <body>
    <div id="wrapper">
      <div id="item">
        <div id="qtn">Question text appears here?</div>
        <div id="inx">
          <div id="ih1">
            <div id="mc1">
              <label id="l1">A.</label>
              <div class="content" style='vertical-align:middle;display:inline-block'>
                <img src="a.gif" height="75px" width="75px" id="img0" alt=""/>
              </div>
            </div>
          </div>
          <div id="ih2">
            <div id="mc2">
              <label id="l2">B.</label>
              <div class="content" style='vertical-align:middle;display:inline-block'>
                <img src="b.gif" height="75px" width="75px" id="img1" alt=""/>
              </div>
            </div>
          </div>
          <div id="ih3">
            <div id="mc3">
              <label id="l3">C.</label>
              <div class="content" style='vertical-align:middle;display:inline-block'>
                <img src="c.gif" height="75px" width="75px" id="img2" alt=""/>
              </div>
            </div>
          </div>
          <div id="ih4">
            <div id="mc4">
              <label id="l4">D.</label>
              <div class="content" style='vertical-align:middle;display:inline-block'>
                <img src="d.gif" height="75px" width="75px" id="img3" alt=""/>
              </div>
            </div>
          </div>
          <div id="ih5">
            <div id="mc5">
              <label id="l5">E.</label>
              <div class="content" style='vertical-align:middle;display:inline-block'>
                <img src="e.gif" height="75px" width="75px" id="img4" alt=""/>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

2 个答案:

答案 0 :(得分:1)

匹配simpleChoice元素时,请尝试在xpath中包含过滤器。例如,

simpleChoice      <!-- matches a simpleChoice element -->
simpleChoice[img] <!-- matches a simpleChoice element with a child img element -->

您可以将它与模板一起使用,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" />

    <xsl:template match="/">
        <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            </head>
            <body>
                ((etc, etc, etc, skipping a bit here for brevity; jumping right
                into the simpleChoice items))
                <xsl:apply-templates select="//simpleChoice" />
            </body>
        </html>
    </xsl:template>

    <!-- This matches all other simpleChoice items that are not matched above. -->
    <xsl:template match="simpleChoice">
        <div class="content">
            <xsl:value-of select="@identifier" />
        </div>
    </xsl:template>

    <!-- This matches simpleChoice items with an img as a direct child -->
    <xsl:template match="simpleChoice[img]">
        <div class="content" style="your style goes here">
            <xsl:value-of select="@identifier" />
        </div>
    </xsl:template>

</xsl:stylesheet>

Live example here


修改

要捕获可能嵌套在simpleChoice块下的图像,您需要搜索后代轴。这是一个非常简单的修改。在我的示例中,更改此行:

<xsl:template match="simpleChoice[img]">

改为:

<xsl:template match="simpleChoice[descendant::img]">

Here is an updated example。您可以阅读有关xpath轴here的更多信息。

答案 1 :(得分:1)

你可以在文字结果元素中使用<xsl:attribute>,只要你在添加任何子元素之前这样做,所以像这样的东西可以工作:

<xsl:template match="simpleChoice">
  <div class="content">
    <xsl:if test="img">
      <xsl:attribute name="style">vertical-align:middle;display:inline-block</xsl:attribute>
    </xsl:if>
    <!-- rest of the div content goes here -->
  </div>
</xsl:template>