Html 显示子节点

Html 显示子节点,html,xml,xslt,Html,Xml,Xslt,我目前有一个简单的标记,主要表示HTML 下面是其中的一个片段 <li>Make this <b>Bold</b></li> 请将此加粗 当然,我可以使用来确保标记被传递并自动显示为粗体,但是我有一个问题 我正在使用另一个XSL,它根据关键字或短语的存储库检查标记,如果它们存在,就会创建链接 下面是我的XSL <xsl:template name="List" match="li"> <li> &

我目前有一个简单的标记,主要表示HTML

下面是其中的一个片段

<li>Make this <b>Bold</b></li>
  • 请将此加粗
  • 当然,我可以使用
    来确保
    标记被传递并自动显示为粗体,但是我有一个问题

    我正在使用另一个XSL,它根据关键字或短语的存储库检查标记,如果它们存在,就会创建链接

    下面是我的XSL

    <xsl:template name="List" match="li">
      <li>
              <xsl:call-template name="markup">
                <xsl:with-param name="text" select="."/>
                <xsl:with-param name="phrases" select="document('../../documents/main/keywords.xml')/keywords/keyword"/>
                <xsl:with-param name="first-only" select="false()"/>
              </xsl:call-template>
      </li>
      </xsl:template>
    
    
    
  • 这种方法可以防止任何子标签被传递,但是我不确定如何才能避免这种情况

    非常感谢您的帮助!
    Dan

    问题在于,您的链接创建模板做了错误的事情

    正确的做法是使用标识模板并为
  • 元素的文本节点后代创建专用模板

    试试这个:

    <xsl:variable 
      name="keywords"
      select="document('../../documents/main/keywords.xml')/keywords/keyword" 
    />
    
    <!-- the identity template does copies of everything not matched otherwise -->
    <xsl:template match="node() | @*">
      <xsl:copy>
        <xsl:apply-templates select="node() | @*" />
      </xsl:copy>
    </xsl:template>
    
    <!-- text nodes in <li> elements get special treatment -->
    <xsl:template match="li//text()">
      <xsl:call-template name="markup">
        <xsl:with-param name="phrases" select="$keywords"/>
        <xsl:with-param name="first-only" select="false()"/>
      </xsl:call-template>
    </xsl:template>
    
    <!-- marks up the current node -->
    <xsl:template name="markup">
      <xsl:with-param name="phrases" />
      <xsl:with-param name="first-only" select="true()" />
    
      <!-- you can use . here - no need to pass in a $text param -->
    </xsl:template>
    
    
    
    身份模板是成功解决此类问题的关键。它可以透明地复制
  • 它完全遍历输入,复制输入,除非更具体的模板与当前节点匹配
  • 这意味着您只需要为要更改的节点编写模板。在这种情况下,匹配文本节点效果最好,因为它们不能有嵌套的子节点
  • 避免使用像
    这样的命名模板。这就是“推式”XSLT,也就是说,它是必需的,并且通常会导致非常笨拙的结果
  • 将节点从流中拉出,并执行比复制节点更复杂的操作。这是“拉式”XSLT,即模板匹配。它通常更容易处理并生成更干净的XSLT代码
  • 当然,您并不局限于
  • 元素中的文本节点。只需更改匹配表达式即可影响其他节点
  • 假设您希望在不中断任何其他模板的情况下将所有
    节点转换为
    。使用“拉动”样式,这与以下内容一样简单:

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

    还请注意,执行
    操作时,当前节点不会更改。因此,不需要将当前节点传递给被调用的模板。

    问题在于,您的链接创建模板做了错误的事情

    正确的做法是使用标识模板并为
  • 元素的文本节点后代创建专用模板

    试试这个:

    <xsl:variable 
      name="keywords"
      select="document('../../documents/main/keywords.xml')/keywords/keyword" 
    />
    
    <!-- the identity template does copies of everything not matched otherwise -->
    <xsl:template match="node() | @*">
      <xsl:copy>
        <xsl:apply-templates select="node() | @*" />
      </xsl:copy>
    </xsl:template>
    
    <!-- text nodes in <li> elements get special treatment -->
    <xsl:template match="li//text()">
      <xsl:call-template name="markup">
        <xsl:with-param name="phrases" select="$keywords"/>
        <xsl:with-param name="first-only" select="false()"/>
      </xsl:call-template>
    </xsl:template>
    
    <!-- marks up the current node -->
    <xsl:template name="markup">
      <xsl:with-param name="phrases" />
      <xsl:with-param name="first-only" select="true()" />
    
      <!-- you can use . here - no need to pass in a $text param -->
    </xsl:template>
    
    
    
    身份模板是成功解决此类问题的关键。它可以透明地复制
  • 它完全遍历输入,复制输入,除非更具体的模板与当前节点匹配
  • 这意味着您只需要为要更改的节点编写模板。在这种情况下,匹配文本节点效果最好,因为它们不能有嵌套的子节点
  • 避免使用像
    这样的命名模板。这就是“推式”XSLT,也就是说,它是必需的,并且通常会导致非常笨拙的结果
  • 将节点从流中拉出,并执行比复制节点更复杂的操作。这是“拉式”XSLT,即模板匹配。它通常更容易处理并生成更干净的XSLT代码
  • 当然,您并不局限于
  • 元素中的文本节点。只需更改匹配表达式即可影响其他节点
  • 假设您希望在不中断任何其他模板的情况下将所有
    节点转换为
    。使用“拉动”样式,这与以下内容一样简单:

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

    还请注意,执行
    操作时,当前节点不会更改。因此,无需将当前节点传递给被调用的模板。

    能否提供有关模板标记功能的更多信息?目前,我看不出li元素的子元素丢失的任何原因。由于您将整个li元素传递给模板(
    ),因此模板中的所有子体都应该仍然可用。从本质上讲,markup.xsl查看关键字库(keywords.xml)并将其与正在查看的文档进行比较,如果匹配,它将使用以下代码:能否提供有关模板标记的更多信息?目前,我看不出li元素的子元素丢失的任何原因。由于您将整个li元素传递给模板(
    ),因此模板中的所有子体都应该仍然可用。从本质上讲,markup.xsl查看关键字库(keywords.xml)并将其与正在查看的文档进行比较,如果匹配,它将使用以下代码:youareastar!真的非常感谢你。你是一个明星!非常感谢。