需要帮助xsl转换 - 不需要的文本

时间:2011-08-24 15:34:12

标签: xslt

我正在尝试仅匹配辅助内容xml标记。但是它正在输出文字“/ Main cotnent就在这里。”为什么要从标头和maincontent标签输出文本?

XML:

<xml>
  <system-data-structure>
    <mastheads>
      <masthead>
        <image>
          <path>/</path>
        </image>
        <alt/>
      </masthead>
    </mastheads>
    <maincontent>
      <content>
        <p>Main content goes here.&#160;</p>
      </content>
    </maincontent>
    <secondary-content>
      <title>
        <h2>Secondary Content Title</h2>
      </title>
      <block>
        <path>/</path>
      </block>
      <content>
        <p>Secondary main content goes here.&#160;</p>
      </content>
    </secondary-content>
    <secondary-content>
      <title></title>
      <block>
        <content>
          <div class="aux-content-box">
            <h2 class="aux-content-box">More Information</h2>
            <ul>
              <li>
                <a href="#">Air Force Tuition Assistance</a>
              </li>
              <li>
                <a href="#">Army Tuition Assistance</a>
              </li>
              <li>
                <a href="#">Coast Guard Tuition Assistance</a>
              </li>
              <li>
                <a href="#">Marine Corps Tuition Assistance</a>
              </li>
              <li>
                <a href="#">Navy Tuition Assistance</a>
              </li>
              <li>
                <a href="#">National Guard State Tuition Assistance</a>
              </li>
              <li>
                <a href="#">National Guard Federal Tuition Assistance</a>
              </li>
              <li>
                <a href="#">Reserve Tuition Assistance</a>
              </li>
              <li>
                <a href="#">US Department of Veteran Affairs: Tuition Assistance Top-Up Program</a>
              </li>
            </ul>
          </div>
        </content>
        <path>/web/current-students/military/military-links-nav</path>
        <name>military-links-nav</name>
      </block>
      <content/>
    </secondary-content>
  </system-data-structure>
</xml>

xsl:

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html" encoding="utf-8"/>
      <xsl:template match="/system-data-structure">

      <xsl:apply-templates select="secondary-content" />
       </xsl:template>


    <xsl:template match="secondary-content">
        Found a learner!
    </xsl:template>

    </xsl:stylesheet>

输出:

/ Main content goes here.  Found a learner! Found a learner! 

3 个答案:

答案 0 :(得分:1)

这是一个经常被问到的问题。这是由于XSLT的built-in templates隐式驱动各种节点的处理。

使用以下模板覆盖文本节点的内置模板:

<xsl:template match="text()"/>

答案 1 :(得分:1)

行为的一个原因是您的第一个模板匹配行

<xsl:template match="/system-data-structure">

在您的XML中,根元素是 xml ,而不是 system-data-structure 。这意味着它与任何东西都不匹配,这就是为什么内置模板如前面的答案中所描述的那样。

尝试用此替换上述行...

<xsl:template match="/xml/system-data-structure">

然后应该产生以下输出

Found a learner!  Found a learner! 

答案 2 :(得分:1)

这是因为在您的第一个模板中,您尝试在根级别匹配system-data-structure。但是,xml是XML示例中的根级别。将匹配更改为/xml/system-data-structure

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

  <xsl:template match="/xml/system-data-structure">  
    <xsl:apply-templates select="secondary-content" />
  </xsl:template>


  <xsl:template match="secondary-content">
    Found a learner!
  </xsl:template>

</xsl:stylesheet>