【问题标题】:XSLT value-of with multiple children of different typesXSLT value-of 具有多个不同类型的子级
【发布时间】:2012-08-09 18:03:36
【问题描述】:

为什么我会得到这些数据:

<A>
  <B>block 1</B>
  <B>block 2</B>
  <C>
    no
  </C>
  <B>block 3</B>
</A>

还有这种转变:

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

<xsl:template match="A/B">
  <xsl:value-of select="."/> <br/>
</xsl:template>

</xsl:stylesheet>

以下输出:

block 1
block 2
no block 3

我希望它是:

block 1
block 2
block 3

那么:为什么要包含 C 块?

//编辑 用这里的东西测试过: http://www.ladimolnar.com/JavaScriptTools/XSLTransform.aspx

【问题讨论】:

    标签: xslt xpath value-of


    【解决方案1】:

    因为Default Template Rules

    <xsl:template match="*|/">
      <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match="text()|@*">
      <xsl:value-of select="."/>
    </xsl:template>
    

    XSL 处理器依次检查每个节点,寻找匹配的模板。如果找不到,则使用默认模板,该模板仅输出文本。在您的情况下,会发生以下情况(“不匹配”表示 您的 样式表中不匹配):

    /A         no match, apply-templates (default element template)
    /A/B       match, output text
    /A/B       match, output text
    /A/C       no match, apply-templates
    /A/C/text  no match, output text (default text template)
    /A/B       match, output text
    

    要跳过路径/A/C,只需添加一个空模板

    <xsl:template match="A/C"/>
    

    这将匹配不需要的元素并抑制输出。

    【讨论】:

    • 谢谢,如果您允许我跟进,我怎样才能获得所需的输出?
    猜你喜欢
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2016-02-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多