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