Xml 从VM配置中使用XSL查询选择特定值

Xml 从VM配置中使用XSL查询选择特定值,xml,parsing,xslt,Xml,Parsing,Xslt,我试图使用XSL文件从XML文档中提取特定值。我试图提取的值位于key节点下,其中key必须包含值CIMHttpsServer。如果它包含我要继续打印信息的值,否则不打印任何内容。我试图搜索它,这是我得到的。如果你看到我的错误,请帮忙 该文件运行良好,直到我开始调整它以返回特定值;现在它执行,但不返回任何内容 <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.

我试图使用XSL文件从XML文档中提取特定值。我试图提取的值位于key节点下,其中key必须包含值CIMHttpsServer。如果它包含我要继续打印信息的值,否则不打印任何内容。我试图搜索它,这是我得到的。如果你看到我的错误,请帮忙

该文件运行良好,直到我开始调整它以返回特定值;现在它执行,但不返回任何内容

    <?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:audit="urn:internalvim25">

<xsl:template match="audit:returnval">

<xsl:for-each select="audit:propSet/audit:val[@xsi:type='HostConfigInfo']/audit:firewall/audit:ruleset/audit:key">

<xsl:if test="key[text()='CIMHttpsServer']">

Key <xsl:value-of select="audit:key"/>
Label <xsl:value-of select="audit:label"/>
Required <xsl:value-of select="audit:required"/>
Rule
-Port <xsl:value-of select="audit:rule/audit:port"/>
-Direction <xsl:value-of select="audit:rule/audit:direction"/>
-Protocol <xsl:value-of select="audit:rule/audit:protocol"/>
Enabled <xsl:value-of select="audit:enabled"/>

</xsl:if>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

你的方法太复杂了。尝试一个更模块化的:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:audit="urn:internalvim25"
    exclude-result-prefixes="audit xsi soap"
>
  <xsl:output type="text" />
  <xsl:variable name="NL" select="'&#xA;'" />

  <xsl:template match="/">
    <xsl:apply-templates select=".//*[audit:key = 'CIMHttpsServer']" />
  </xsl:template>

  <xsl:template match="audit:ruleset">
    <xsl:value-of select="concat('Key: ', audit:key, $NL)" />
    <xsl:value-of select="concat('Label: ', audit:label, $NL)" />
    <xsl:value-of select="concat('Required: ', audit:required, $NL)" />
    <xsl:apply-templates select="audit:rule" />
    <xsl:value-of select="concat('Enabled: ', audit:enabled, $NL)"/>
  </xsl:template>

  <xsl:template match="audit:rule">
    <xsl:value-of select="concat('Rule', $NL)" />
    <xsl:value-of select="concat('-Port: ', audit:port, $NL)" />
    <xsl:value-of select="concat('-Direction: ', audit:direction, $NL)" />
    <xsl:value-of select="concat('-Protocol: ', audit:protocol, $NL)" />
  </xsl:template>
</xsl:stylesheet>

注释

  • 避免输出“未防护”文本。要么像我那样使用
    ,要么
    。您的源代码将看起来更干净(因为您可以开始正确缩进),并且您将更容易格式化输出
  • 使用模板匹配。不要将整个处理逻辑塞进一个有N个嵌套级别的大模板中
  • 如果要输出纯文本,请使用适当的输出模式
  • 如果您不输出纯文本,并且希望防止输入名称空间出现在输出中,请使用
    排除结果前缀。不过,始终启用该功能并没有什么坏处
  • 您不需要声明不打算使用的名称空间
    soap
    xsi
    对样式表没有影响,您可以省略它们

我建议您开始在XSLT中使用。如果这样做,则可以使用以下XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:audit="urn:internalvim25">
    <xsl:output method="text" encoding="UTF-8" />

    <xsl:variable name="lf" select="'&#10;'" />

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

    <xsl:template match="audit:ruleset[audit:key = 'CIMHttpsServer']">
        <xsl:text>Key </xsl:text><xsl:value-of select="audit:key"/><xsl:value-of select="$lf" />
        <xsl:text>Label </xsl:text><xsl:value-of select="audit:label"/><xsl:value-of select="$lf" />
        <xsl:text>Required </xsl:text><xsl:value-of select="audit:required"/><xsl:value-of select="$lf" />
        <xsl:text>Rule</xsl:text><xsl:value-of select="$lf" />
        <xsl:text>-Port </xsl:text><xsl:value-of select="audit:rule/audit:port"/><xsl:value-of select="$lf" />
        <xsl:text>-Direction </xsl:text><xsl:value-of select="audit:rule/audit:direction"/><xsl:value-of select="$lf" />
        <xsl:text>-Protocol </xsl:text><xsl:value-of select="audit:rule/audit:protocol"/><xsl:value-of select="$lf" />
        <xsl:text>Enabled </xsl:text><xsl:value-of select="audit:enabled"/><xsl:value-of select="$lf" />
    </xsl:template>
</xsl:stylesheet>

太神了非常感谢。第一个例子,你的方式,是我在遇到这些问题时试图学习的。非常感谢。吹毛求疵,但是
&10
lf
不是
crlf
。也不确定在这里使用身份模板有什么好处?@Tomalak:Oops。。把它改回lf。我总是开始使用标识模板,因为它看起来像是一段代码片段,并且认为在不久的将来可能需要更多的模板。。。喜欢您的concat()版本…在用于输出纯文本的转换中,它不会有任何好处。(如果它坏了,就像你的版本一样,情况就更糟了。)你需要再看一看它……)工作得很好,展示了另一种技术。非常感谢。
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:audit="urn:internalvim25"
    exclude-result-prefixes="audit xsi soap"
>
  <xsl:output type="text" />
  <xsl:variable name="NL" select="'&#xA;'" />

  <xsl:template match="/">
    <xsl:apply-templates select=".//*[audit:key = 'CIMHttpsServer']" />
  </xsl:template>

  <xsl:template match="audit:ruleset">
    <xsl:value-of select="concat('Key: ', audit:key, $NL)" />
    <xsl:value-of select="concat('Label: ', audit:label, $NL)" />
    <xsl:value-of select="concat('Required: ', audit:required, $NL)" />
    <xsl:apply-templates select="audit:rule" />
    <xsl:value-of select="concat('Enabled: ', audit:enabled, $NL)"/>
  </xsl:template>

  <xsl:template match="audit:rule">
    <xsl:value-of select="concat('Rule', $NL)" />
    <xsl:value-of select="concat('-Port: ', audit:port, $NL)" />
    <xsl:value-of select="concat('-Direction: ', audit:direction, $NL)" />
    <xsl:value-of select="concat('-Protocol: ', audit:protocol, $NL)" />
  </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:audit="urn:internalvim25">
    <xsl:output method="text" encoding="UTF-8" />

    <xsl:variable name="lf" select="'&#10;'" />

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

    <xsl:template match="audit:ruleset[audit:key = 'CIMHttpsServer']">
        <xsl:text>Key </xsl:text><xsl:value-of select="audit:key"/><xsl:value-of select="$lf" />
        <xsl:text>Label </xsl:text><xsl:value-of select="audit:label"/><xsl:value-of select="$lf" />
        <xsl:text>Required </xsl:text><xsl:value-of select="audit:required"/><xsl:value-of select="$lf" />
        <xsl:text>Rule</xsl:text><xsl:value-of select="$lf" />
        <xsl:text>-Port </xsl:text><xsl:value-of select="audit:rule/audit:port"/><xsl:value-of select="$lf" />
        <xsl:text>-Direction </xsl:text><xsl:value-of select="audit:rule/audit:direction"/><xsl:value-of select="$lf" />
        <xsl:text>-Protocol </xsl:text><xsl:value-of select="audit:rule/audit:protocol"/><xsl:value-of select="$lf" />
        <xsl:text>Enabled </xsl:text><xsl:value-of select="audit:enabled"/><xsl:value-of select="$lf" />
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:audit="urn:internalvim25">
    <xsl:template match="audit:returnval">
        <xsl:for-each select="audit:propSet/audit:val[@xsi:type='HostConfigInfo']/audit:firewall/audit:ruleset[audit:key = 'CIMHttpsServer']">
Key <xsl:value-of select="audit:key"/>
Label <xsl:value-of select="audit:label"/>
Required <xsl:value-of select="audit:required"/>
Rule
-Port <xsl:value-of select="audit:rule/audit:port"/>
-Direction <xsl:value-of select="audit:rule/audit:direction"/>
-Protocol <xsl:value-of select="audit:rule/audit:protocol"/>
Enabled <xsl:value-of select="audit:enabled"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>