gpt4 book ai didi

xslt - 如何选择没有特定父节点作为祖先的子节点?

转载 作者:行者123 更新时间:2023-12-03 16:13:12 24 4
gpt4 key购买 nike

我们将 CruiseControl 用于我们的构建服务器。它使用 MSBuild 编译我们的应用程序,并使用自己的 XML 记录器,输出类似于以下 XML 的内容:

<project name="CI">
<target name="CompileApp">
<project name="Project1.csproj">
<target name="build">
<error>Compilation error one!</error>
</target>
<target name="BeforeBuild">
<project name="Project2.csproj">
<target name="build">
<error>Compilation error two!</error>
</target>
</project>
</target>
</project>
</target>
</project>

我想将其转换为输出每个项目错误的报告。我不想报告其他项目中的错误。
  Project "Project1.csproj": 1 error(s)
Error(s):
Compilation error one!

Project "Project2.csproj": 1 error(s)
Error(s):
Compilation error two!

这是我得到的最接近的,但这是不对的。显示 project1 的错误时,它不会过滤掉 project2 的错误。
<xsl:template>
<xsl:variable select="//project[.//error]" name="projects.with.errors" />
<xsl:apply-templates select="$projects.with.errors" />
</xsl:template>

<xsl:template match="project">
<xsl:variable select="./*[not(project)]//error" name="errors" />
<xsl:if test="count($errors) > 1">
<!-- display errors -->
</xsl:if>
</xsl:template>

如何过滤掉与当前项目节点具有不同项目祖先的任何错误节点?即,如何只选择没有项目祖先的后代错误节点?

错误节点可以有任意数量的父元素(通常,但不总是)。

最佳答案

这是一个非常简单的解决方案:

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

<xsl:template match="/">
<xsl:apply-templates select="//project[.//error]" />
</xsl:template>

<xsl:template match="project">
<xsl:variable name="errors" select=".//error[ancestor::project[1]/@name = current()/@name]" />
<xsl:if test="count($errors) != 0">
<xsl:value-of select="concat('Project &quot;',@name,'&quot;: ',count($errors),' error(s)&#10;Error(s):&#10;')" />
<xsl:apply-templates select="$errors" />
<xsl:text>&#10;</xsl:text>
</xsl:if>
</xsl:template>

<xsl:template match="error">
<xsl:value-of select="concat(.,'&#10;')" />
</xsl:template>
</xsl:stylesheet>

这个样式表基本上只是为每个 project 调用一个模板。文档树中任意位置的元素。此模板使用选择所有 error 的 xpath 在变量中存储所有错误的列表。当前 project 的后代元素并拥有当前 project第一个元素 project祖先。然后,如果有的话,它只输出适当的标题文本并将模板应用于每个错误。

我正在使用 &#10;对于此处的换行符,但如果您更喜欢 windows 换行符,则可以使用 &#13;&#10; .

对这一点的小警告;您最终会在输出的底部得到一个空行,因为它会在每个项目的底部添加一个以将其与下一个分开。

关于xslt - 如何选择没有特定父节点作为祖先的子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3135926/

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