首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xslt(test1.xsl)不在根目录( system-characteristics.xml)下

xslt(test1.xsl)不在根目录( system-characteristics.xml)下
EN

Stack Overflow用户
提问于 2016-01-27 09:11:36
回答 2查看 28关注 0票数 1

主题: xslt(test1.xsl)不在根目录下( system-characteristics.xml)

命令行: java -jar SaxonHE9-7-0-1J\saxon9he.jar -o:oval-output.xml -xsl:test1.xsl -charactertics.xml

Output:===== oval-output.xml =======

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>  help (oval_system_characteristics)

========== system-Charactertics.xml =============

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<oval_system_characteristics xmlns="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5" xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5" xmlns:oval-sc="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5" xmlns:win-sc="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5#windows" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5 oval-system-characteristics-schema.xsd http://oval.mitre.org/XMLSchema/oval-common-5 oval-common-schema.xsd http://oval.mitre.org/XMLSchema/oval-system-characteristics-5#windows windows-system-characteristics-schema.xsd">

  <generator>
    <oval:product_name>cpe:/a:mitre:ovaldi:5.10.1.7</oval:product_name>
    <oval:product_version>5.10.1 Build: 7</oval:product_version>
    <oval:schema_version>5.10.1</oval:schema_version>
    <oval:timestamp>2016-01-16T19:34:09</oval:timestamp>
    <vendor xmlns="">The MITRE Corporation</vendor>
  </generator>
</oval_system_characteristics>

================== test1.xsl =======

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5" xmlns:oval-sc="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5" xmlns:win-sc="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5#windows" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5 oval-system-characteristics-schema.xsd http://oval.mitre.org/XMLSchema/oval-common-5 oval-common-schema.xsd http://oval.mitre.org/XMLSchema/oval-system-characteristics-5#windows windows-system-characteristics-schema.xsd" version="2.0" >

<xsl:output method="xml"/>
<xsl:template match="/">
    <xsl:text>  help </xsl:text>
    <xsl:text>(</xsl:text>
    <xsl:value-of select="name(*)"/>
    <xsl:text>)</xsl:text>
    <xsl:apply-templates select="generator"/>
</xsl:template>

<xsl:template match="generator">
    <xsl:text>  help </xsl:text>
    <xsl:text>(</xsl:text>
    <xsl:value-of select="name(*)"/>
    <xsl:text>)</xsl:text>
</xsl:template>

</xsl:stylesheet>
EN

回答 2

Stack Overflow用户

发布于 2016-01-27 10:41:30

您的第一个模板与根匹配,但是“根”实际上是它自己的节点,比文档中的第一个元素( oval_system_characteristics )高一级。

要使xsl:apply-templates在与/匹配的模板中工作,它必须能够找到与其当前上下文中的节点匹配的模板。在根目录( / )的上下文中,可以匹配的节点是元素oval_system_characteristics。因为您已经告诉xsl:apply-templates只选择generator,并且该元素不是当前上下文的子元素,所以不会得到匹配。

最好从xsl:apply-templates中去掉select属性,为您想要处理的所有元素创建一个模板,然后让XSL来完成繁重的工作。built-in template rule将匹配一个元素并调用<xsl:apply-templates/>,除非有更具体的模板匹配。

因此,您可以创建另一个与oval_system_characteristics匹配的模板,如果您不想在此时执行任何操作,则只需在该模板中放置一个<xsl:apply-templates/>

由于该模板在生成器上进行了匹配,因此它的xsl:apply-templates将尝试查找与其当前上下文中的元素相匹配的元素--也就是说,它将查找与生成器匹配的模板(因为生成器位于oval_system_characteristic的上下文中)。

您也可以将该<xsl:apply-templates select="generator"/>更改为<xsl:apply-templates select="oval_system_characteristic/generator"/>。由于oval_system_characteristic位于/上模板匹配的上下文中,因此XPath路径"oval_system_characteristic/generator“将把XSLT处理器指向与"generator”匹配的模板。这是一个很有用的捷径--但一般来说,最好使用普通的<xsl:apply-templates/>,因为这样就可以编写样式表来容纳可能包含在oval_system_characteristic中的任何元素。

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2016-01-27 10:49:17

有几个问题阻碍了您的样式表生成所需的输出。

  1. 将XML文档中的元素绑定到名称空间。这可能很难看出来,因为它们没有使用名称空间前缀,但是document元素中的xmlns="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5"意味着该元素(以及它的所有后代,除非被显式覆盖)都绑定到该名称空间。为了在XSLT的XPath中寻址它,您应该使用在样式表中声明的名称空间前缀。
  2. 在根节点的模板中,匹配/ (它不是文档元素oval_system_characteristics,而是节点树中它上面的一个空格),您正在尝试选择子元素生成器。这看起来似乎有悖于直觉,但这就是如何处理出现在文档元素之前的comment()processing-instruction()的。在此模板中,根节点的子节点是文档元素oval_system_characteristics,因此需要调整XPath。匹配generator的模板需要匹配oval-sc:generator,因为oval-sc:generator的模板继承了生成器,上下文节点就是那个生成器元素。要获取它的名称,请使用name(.)而不是name(*)。后者将为您提供上下文节点的子元素的名称。在这种情况下,有多个元素,所以您会得到一个错误,因为name()需要单个项目。

如果您调整样式表,它将产生所需的结果:

代码语言:javascript
复制
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
    xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5" 
    xmlns:oval-sc="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5" 
    xmlns:win-sc="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5#windows" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5 oval-system-characteristics-schema.xsd http://oval.mitre.org/XMLSchema/oval-common-5 oval-common-schema.xsd http://oval.mitre.org/XMLSchema/oval-system-characteristics-5#windows windows-system-characteristics-schema.xsd" 
    version="2.0" >

    <xsl:output method="xml"/>
    <xsl:template match="/">
        <xsl:text>  help </xsl:text>
        <xsl:text>(</xsl:text>
        <xsl:value-of select="name(*)"/>
        <xsl:text>)</xsl:text>
        <xsl:apply-templates select="oval-sc:oval_system_characteristics/oval-sc:generator"/>
    </xsl:template>

    <xsl:template match="oval-sc:generator">
        <xsl:text>  help </xsl:text>
        <xsl:text>(</xsl:text>
        <xsl:value-of select="name(.)"/>
        <xsl:text>)</xsl:text>
    </xsl:template>

</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35027096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档