- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个编码一个 XML 文件
directed acyclic graph(DAG)表示 partial order .这样的图表对于指定依赖关系和查找 critical paths 等事情很有用。 .出于好奇,我当前的应用程序是为 build system 指定组件依赖项。 ,所以顶点是组件,边指定编译时依赖项。这是一个简单的例子:
<?xml version="1.0"?>
<dag>
<vertex name="A">
<directed-edge-to vertex="C"/>
</vertex>
<vertex name="B">
<directed-edge-to vertex="C"/>
<directed-edge-to vertex="D"/>
</vertex>
<vertex name="C">
<directed-edge-to vertex="E"/>
</vertex>
<vertex name="D">
<directed-edge-to vertex="E"/>
</vertex>
<vertex name="E">
<directed-edge-to vertex="G"/>
</vertex>
<vertex name="F">
<directed-edge-to vertex="G"/>
</vertex>
<vertex name="G"/>
</dag>
{A, B, F}
.对于我的构建依赖应用程序,找到这个集合很有值(value),因为我知道如果我构建这个集合的成员,那么我的项目中的所有内容都将被构建。
xslt
任务在 Java 上使用 Xalan 运行它)。一个关键的观察结果是任何
directed-edge-to
中都不会引用最小顶点。元素:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xslt"
exclude-result-prefixes="xalan">
<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>
<xsl:template match="dag">
<minimal-vertices>
<xsl:for-each select="//vertex">
<xsl:if test="not(//vertex/directed-edge-to[@vertex=current()/@name])">
<minimal-vertex name="{@name}"/>
</xsl:if>
</xsl:for-each>
</minimal-vertices>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<minimal-vertices>
<minimal-vertex name="A"/>
<minimal-vertex name="B"/>
<minimal-vertex name="F"/>
</minimal-vertices>
select
的for-each
和 test
的if
使用 XPath 语法。
<xsl:for-each select="//vertex[not(//vertex/directed-edge-to[@vertex=current()/@name])]">
current()
函数不引用外部
//vertex
选择的节点表达。
<?xml version="1.0"?>
<project name="minimal-dag" default="default">
<target name="default">
<xslt in="dag.xml" out="minimal-vertices.xml" style="find-minimal-vertices.xsl"/>
</target>
<target name="dot">
<xslt in="dag.xml" out="dag.dot" style="xml-to-dot.xsl"/>
</target>
</project>
dot
目标生成
Graphviz
Dot
language用于渲染图形的代码。这里是
xml-to-dot.xsl
:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xslt"
exclude-result-prefixes="xalan">
<xsl:output method="text"/>
<xsl:template match="dag">
digraph {
rankdir="BT";
node [style="filled", fillcolor="cyan", fontname="Helvetica"];
<xsl:apply-templates select="//directed-edge-to"/>
}
</xsl:template>
<xsl:template match="directed-edge-to">
<xsl:value-of select="concat(ancestor::vertex/@name, '->', @vertex, ';')"/>
</xsl:template>
</xsl:stylesheet>
最佳答案
您可以在 =
上利用 XPath 的隐式存在量化。运算符(operator):
<xsl:for-each select="//vertex[not(@name = //vertex/directed-edge-to/@vertex)]">
=
、
!=
、
<
、
<=
、
>
和
>=
)来比较节点集时,如果有任何节点,表达式将返回 true在节点集中满足条件。在将一个节点集与另一个节点集进行比较时,如果第一个节点集中的任何节点在与第二个节点集中的任何节点进行比较时满足条件,则表达式返回 true。 XPath 2.0 引入了六个不执行这种存在量化的新运算符(
eq
、
ne
、
lt
、
le
、
gt
和
ge
)。但在你的情况下,你会想要使用“
=
”来获得存在量化。
not()
像你做的那样工作。大多数时候,最好避免使用
!=
运算符(operator)。如果你在这里使用它而不是
not()
, 如果有
@vertex
则返回 true不等于
@name
的属性值,这不是你的意图。 (如果任一节点集为空,则返回 false,因为与空节点集的比较总是返回 false。)
eq
取而代之的是,您必须像以前那样做:将条件从迭代中分离出来,这样您就可以绑定(bind)
current()
.但在 XPath 2.0 中,您可以在表达式中执行此操作:
<xsl:for-each select="for $v in //vertex
return $v[not(//directed-edge-to[@vertex eq $v/@name])]">
=
”进行存在量化),这很有用。例如:
starts-with(@vertex, $v/@name)
.
for
上面的表达式,我们可以这样写:
<xsl:for-each select="//vertex[not(some $e in //directed-edge-to
satisfies @name eq $e/@vertex)]">
some
”语法之外,XPath 2.0 还提供了相应的“
every
”语法来执行通用量化。
for-each
,您还可以使用更模块化(且功能强大)的模板规则:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<minimal-vertices>
<xsl:apply-templates/>
</minimal-vertices>
</xsl:template>
<!-- Copy vertex elements that have no arrows pointing to them -->
<xsl:template match="vertex[not(@name = //directed-edge-to/@vertex)]">
<minimal-vertex name="{@name}"/>
</xsl:template>
</xsl:stylesheet>
=
的存在量化。 .
current()
模式中的函数,即在
match
中属性,但 XSLT 2.0 允许。在这种情况下,
current()
指当前匹配的节点。所以在 XSLT 2.0 中,我们也可以这样写(不必使用
for
表达式):
<xsl:template match="vertex[not(//directed-edge-to[@vertex eq current()/@name])]">
for-each
中使用的表达式基本相同。 , 但是它在
for-each
中并没有做你想做的事,它确实在模式中执行您想要的操作(因为
current()
绑定(bind)的内容不同)。
not()
)。这也可以追溯到使用 XSLT 1.0:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<minimal-vertices>
<xsl:apply-templates/>
</minimal-vertices>
</xsl:template>
<!-- By default, copy vertex elements -->
<xsl:template match="vertex">
<minimal-vertex name="{@name}"/>
</xsl:template>
<!-- But strip out vertices with incoming arrows -->
<xsl:template match="vertex[@name = //directed-edge-to/@vertex]"/>
</xsl:stylesheet>
<xsl:template match="text()"/>
<xsl:apply-templates select="/dag/vertex"/>
关于xslt - 使用 XSLT/XPath 查找有向无环图 (DAG) 最小元素(顶点)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/843874/
我有一个 XSLT 样式表,如下所示: 我想使用第二个 XSLT 样式表来转换此样式表,以删除与 XQHead
我们有一个大型 xslt,可以呈现整个商店区域,包括产品、制造商,并根据价格和类别进行过滤。我使用 sitecore 作为 CMS,但遇到缓存问题。我有大约 9000 个项目,有些页面需要长达 20
我想根据条件的结果应用具有不同参数的模板。像这样: Attribute no. 1
我有一些看起来像这样的 XML Foo Details Bar Details Baz Details Foo Blah Bar BlahBlah Baz BlahBlahBl
我试图从这种输入出发: a b c d e f g ... 使用 XSLT 的 HTML 输出: one two a e b f
我想知道如何在 xslt 中找到特定节点的第一个子节点名称。 我有一个 xml: some text 我可以使用 body/
是否可以在 XSLT 中获取上个月的最后一天?我找到了这个函数:http://www.xsltfunctions.com/xsl/functx_last-day-of-month.html但我不确定如
具有特定节点的匹配元素存在问题。 xml: description of profile PhoneKeyPad S
我将一堆键值对作为参数传递给 XSL(日期 ->“1 月 20 日”,作者 ->“Dominic Rodger”,...)。 我正在解析的一些 XML 中引用了这些 - XML 如下所示: 目前,除
我找不到这个问题的确切答案,所以我希望有人能在这里帮助我。 我有一个字符串,我想在最后一个 '.' 之后获取子字符串。我正在使用 xslt 1.0。 这是怎么做的?这是我的代码。
我在尝试找出 xslt 上的 var 范围时遇到问题。我实际上想要做的是忽略具有重复“旅游代码”的“旅行”标签。 示例 XML: X1 Budapest X1 Budapest X
我有一些数据在 xslt 的 for-each 循环中输出。我对列表进行了分页,但没有对排序选择器进行分页。 用户应该能够对 2 个值(创建的数据和每个项目的数字字段)进行排序。默认的排序方法是创建日
我有一个奇怪的要求。 我在 xslt 中有一个包含月份的变量,带有它们的 id (1-12) 问题是我需要全部显示它们,但从一月(1)以外的月份开始。 目前我有以下 JAN
如何在 xslt 转换中模块化一组重复的输出?例如,我有如下内容(伪代码)。 并
我得到一个像这样的字符串。 13091711111100222222003333330044444400 字符串的模式是这样的 13 - 09 - 17 - 11111 - 100 - 22222 -
我是 XSLT 的新手,有一个一般性问题。为了区分具有不同属性的两个元素,最好(也是为了性能)使用 和 而不是 在一个模板中。据我所知,这就是 XSLT 中应该“思考”的方式。但在我看来,这有一个缺点
如何从“19650512-0065”到“196505120065”这样的字符串中删除连字符 使用这个模板:传递 theID =
是否有任何功能可以在左侧填充零? 我正在尝试做的要求是: 我们不知道即将到来的输入字符串长度。 如果小于 20,我们必须在左侧填充零。 如果输入字符串长度为 10,那么我们必须在左侧填充 10 个零。
身份模板如下所示: 是否选择多于 ,或者身份模板可能是这样的? 当我执行以下操作时,究竟选择了什么? 最佳答案
我正在尝试使用 XML 信息和 XSLT 模板创建超链接。这是 XML 源代码。 Among individual stocks, the top percentage gainers in the
我是一名优秀的程序员,十分优秀!