值-6ren"> 值-我用 MySQL 查询浏览器生成了一个 XML。我正在尝试应用 XSLT 将结果输出到 Word 表中。每条记录一张表。 这是我的 XML 示例 Critique -6ren">
gpt4 book ai didi

mysql - XSLT + XML -> Word <字段名 ="foo">值

转载 作者:行者123 更新时间:2023-11-29 01:43:36 28 4
gpt4 key购买 nike

我用 MySQL 查询浏览器生成了一个 XML。我正在尝试应用 XSLT 将结果输出到 Word 表中。每条记录一张表。

这是我的 XML 示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ROOT SYSTEM "Nessus.dtd">
<ROOT>
<row>
<field name="Niveau">Critique</field>
<field name="Name">Apache 2.2 &lt; 2.2.15 Multiple Vulnerabilities</field>
</row>
<row>
<field name="Niveau">Critique</field>
<field name="VulnName">Microsoft Windows 2000 Unsupported Installation Detection</field>
</row>
<row>
<field name="Niveau">Haute</field>
<field name="VulnName">CGI Generic SQL Injection</field>
</row>
</ROOT>

对于 XLST,我已经发现我需要为每个选择做一个

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="ROOT/row">
Niveau : <xsl:value-of select="????"/>
Name : <xsl:value-of select="????"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

当我执行此循环时,我看到的空表数量与 <row></row> 相同。在我的文件中。

但是我还没有找到正确的“value-of select=”的方法。我没有运气就尝试了以下方法。

<xsl:value-of select="@name"/>
<xsl:value-of select="name"/>
<xsl:value-of select="@row/name"/>
<xsl:value-of select="row/@name"/>
<xsl:value-of select="@ROOT/row/name"/>

还有一些我不记得了。知道我需要什么来制作请求以获取结果文件中的值吗?

我刚试过:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="ROOT/row">
Niveau : <xsl:value-of select="field/@Niveau"/>
Name : <xsl:value-of select="field/@name"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

它输出这个:

NIVEAU :  
NAME : name

NIVEAU :
NAME : Niveau

NIVEAU :
NAME : Niveau

我想要这样的输出:

NIVEAU : Critique
NAME : Apache 2.2 &lt; 2.2.15 Multiple Vulnerabilities

NIVEAU : Critique
NAME : Microsoft Windows 2000 Unsupported Installation Detection

NIVEAU : Haute
NAME : CGI Generic SQL Injection

如有任何帮助,我们将不胜感激。

谢谢。

更新

现在有了这个 XSLT

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">

<xsl:output method="text"/>

<xsl:strip-space elements="*"/>

<xsl:template match="row">
<xsl:text>NIVEAU : </xsl:text>
<xsl:value-of select="field[@name = 'Niveau']"/>
<xsl:text>&#xa;</xsl:text>
<xsl:text>NAME : </xsl:text>
<xsl:value-of select="field[@name = 'Name']"/>
<xsl:text>&#xa;&#xa;</xsl:text>
</xsl:template>

</xsl:stylesheet>

我得到这个输出:

<?xml version="1.0"?>
NIVEAU :
NAME : Apache 2.2 &lt; 2.2.15 Multiple Vulnerabilities

NIVEAU : Critique
NAME : Microsoft Windows 2000 Unsupported Installation Detection

NIVEAU : Haute
NAME : CGI Generic SQL Injection

如您所见,第一个字段是空的。老实说,我可以接受并手动填充它,但如果你明白为什么会这样,我会很高兴:)

更新

使用 <xsl:value-of select="field[@name = 'foo']"/>给了我想要的值(value)。我保留了 for-each,因为它更易于在 MS Word 模板中使用(对我而言)。

最佳答案

for-each 通常是 XSLT 中的代码味道。您很可能需要一个模板,而不是 for-each 循环:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>

<xsl:template match="field">
<xsl:value-of select="@name"/> : <xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

此模板将产生以下输出:

<root>

Niveau : Critique
name : Apache 2.2 &lt; 2.2.15 Multiple Vulnerabilities


Niveau : Critique
name : Microsoft Windows 2000 Unsupported Installation Detection


Niveau : Haute
name : CGI Generic SQL Injection

</root>

XSLT 是为这种使用模式而设计的——许多 xsl:template 匹配源的一小部分并递归地应用其他模板。此模式中最重要和最常见的模板是身份模板,它复制输出。 This is a good tutorial on XSLT coding patterns你应该阅读。

更新

下面是一个完整的解决方案,它将生成文本 输出(因为这似乎是您想要的,而不是 XML 输出)。我不确定 xsl 是最好的语言,但它确实有效....

请注意,我们唯一使用 for-each 的地方是为了排序以确定最长名称的长度。我们使用模板和模式匹配 select 来使所有其他循环隐式化。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="newline"><xsl:text>
</xsl:text></xsl:variable>

<!-- determine the maximum length of the "name" field so we can pad with spaces for all shorter items -->
<xsl:variable name="max_name_len">
<xsl:for-each select="ROOT/row/field/@name">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="string-length(.)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>

<!-- for each row, apply templates then add a blank line -->
<xsl:template match="row">
<xsl:apply-templates/>
<xsl:value-of select="$newline"/>
</xsl:template>

<!-- for each field, apply template to name and add value, followed by a newline -->
<xsl:template match="field">
<xsl:apply-templates select="@name"/> : <xsl:value-of select="concat(., $newline)"/>
</xsl:template>


<!-- for each name, uppercase and pad with spaces to the right -->
<xsl:template match="field/@name">
<xsl:call-template name="padright">
<xsl:with-param name="text">
<xsl:call-template name="toupper">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name="len" select="$max_name_len"/>
</xsl:call-template>
</xsl:template>


<!-- Utility function: uppercase a string -->
<xsl:template name="toupper">
<xsl:param name="text"/>
<xsl:value-of select="translate($text, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
</xsl:template>

<!-- Utility function: pad a string to desired len with spaces on the right -->
<!-- uses a recursive solution -->
<xsl:template name="padright">
<xsl:param name="text"/>
<xsl:param name="len"/>
<xsl:choose>
<xsl:when test="string-length($text) &lt; $len">
<xsl:call-template name="padright">
<xsl:with-param name="text" select="concat($text, ' ')"/>
<xsl:with-param name="len" select="$len"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>

此样式表产生以下输出:

NIVEAU : Critique
NAME : Apache 2.2 < 2.2.15 Multiple Vulnerabilities

NIVEAU : Critique
NAME : Microsoft Windows 2000 Unsupported Installation Detection

NIVEAU : Haute
NAME : CGI Generic SQL Injection

关于mysql - XSLT + XML -> Word <字段名 ="foo">值</foo>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239925/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com