【发布时间】:2019-04-26 00:08:09
【问题描述】:
能否请您帮助如何将子节点分成两半。
输入:
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FileHashRule Id="1">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xCC864"></FileHash>
<FileHash Type="SHA256" Data="0x9D973"></FileHash>
<FileHash Type="SHA256" Data="0xA92EF"></FileHash>
<FileHash Type="SHA256" Data="0x279CD"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
输出:
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FileHashRule Id="hard-coded guid1">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xCC864"></FileHash>
<FileHash Type="SHA256" Data="0x9D973"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
<FileHashRule Id="hard-coded guid2">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0xA92EF"></FileHash>
<FileHash Type="SHA256" Data="0x279CD"></FileHash>
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
不幸的是,我没有使用 xslt 的经验,也没有找到这样的示例。
更新 我尝试了以下建议的方法之一,并且此 https://xsltfiddle.liberty-development.net/jyH9rNq/3 节点不会复制
xslt:
<?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:variable name="fileHash" select="/FileHashRule/Conditions/FileHashCondition/FileHash" />
<xsl:variable name="half" select="count($fileHash) div 2" />
<xsl:template match="/">
<RuleCollection>
<FileHashRule>
<xsl:attribute name="Id">ad22d301-eb88-485d-ae1d-537790bdebfa</xsl:attribute>
<Conditions>
<FileHashCondition>
<xsl:copy-of select="$fileHash[position() <= $half]" />
</FileHashCondition>
</Conditions>
</FileHashRule>
<FileHashRule>
<xsl:attribute name="Id">ad22d301-eb88-485d-ae1d-537790bdebfb</xsl:attribute>
<Conditions>
<FileHashCondition>
<xsl:copy-of select="$fileHash[position() > $half]" />
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
</xsl:template>
</xsl:stylesheet>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<RuleCollection>
<FileHashRule Id="ad22d301-eb88-485d-ae1d-537790bdebfa">
<Conditions>
<FileHashCondition/>
</Conditions>
</FileHashRule>
<FileHashRule Id="ad22d301-eb88-485d-ae1d-537790bdebfb">
<Conditions>
<FileHashCondition/>
</Conditions>
</FileHashRule>
</RuleCollection>
【问题讨论】:
-
定义“一半”,尤其是。在奇数节点的情况下。 -- 另请注意,您显示的输出不是格式良好的 XML(缺少单个根元素)。
-
@michael.hor257k,已更正,大约一半,没关系
-
当你学习一门新语言时,你不需要经验,也不需要一个例子来解决你正在解决的确切问题,你需要一本好书或教程来教授概念,你应该先通过简单的练习来学习,然后再尝试解决更困难的问题。
-
您不断更改输入 XML 格式。现在您已经添加了
RuleCollection包装器,您必须将fileHash变量定义更改为:<xsl:variable name="fileHash" select="/RuleCollection/FileHashRule/Conditions/FileHashCondition/FileHash" />- 请参阅:xsltfiddle.liberty-development.net/jyH9rNq/4 -
@michael.hor257k,非常感谢,效果很好。我需要什么