【发布时间】:2018-09-12 03:36:57
【问题描述】:
我有两个文件:Rules_Generic File (generic.xml) & (Rules_Values.txt)。 我想通过从 generic.xml 中提取规则语法并填充 Rules_Values.txt 中的值来找到一种编写新 XML 文件的方法
我搜索了一下,发现可以使用 XSLT。以下是(Rules_Values.txt)
#VNF_Type VNF_Id min_num_Instance max_num_Instance ScalingOut% ScalingIn% min_num_CPUs max_num_CPUs Migration_Type
Firewall f1 1 4 60% 20% 4 8 Pre-Copy
Firewall f2 2 6 80% 10% 2 6 Post-Copy
Cache c1 2 8 90% 30% 2 6 Hybrid
以下是(generic.xml)
<?xml version="1.0" encoding="UTF-8"?>
<PolicySet PolicySetId="PS2" PolicySetName="ResourceAdaptation" Client_Id =" ">
<PolicySet SFC_Name="">
<Policy PolicyId=" ">
<Target>
<Subject>VNF_Type</Subject>
</Target>
<!-- Horizontal_Scaling -->
<Rule RuleId="R1" Effect="Affinity">
<Target>
<Subject>VNF_ID</Subject>
<Action>Horizontal_Scaling</Action>
<Resource>numOfInstances</Resource>
</Target>
<conditions>
<condition>min_numOfInstances: Any_Positive_Integer</condition>
<condition>max_numOfInstances: Any_Positive_Integer</condition>
</conditions>
</Rule>
<!-- Vertical_Scaling -->
<Rule RuleId="R2" Effect="Affinity">
<Target>
<Subject>VNF_ID</Subject>
<Action>Vertical_Scaling</Action>
<Resource>numOfCPUcores</Resource>
</Target>
<conditions>
<condition>min_numOfCPUcores: Any_Positive_Integer</condition>
<condition>max_numOfCPUcores: Any_Positive_Integer</condition>
</conditions>
</Rule>
<!-- Horizontal-Scaling threshold-based 1- scaling_Out 2- scaling_In -->
<Rule RuleId = "R3" Effect="Affinity">
<Target>
<Subject>VNF_ID</Subject>
<Action>Scaling_Out</Action>
<Resource>cpu_Utilization</Resource>
</Target>
<conditions>
<condition>utilization greater_than threshold%</condition>
</conditions>
</Rule>
<Rule RuleId = "R4" Effect="Affinity">
<Target>
<Subject>VNF_ID</Subject>
<Action>Scaling_In</Action>
<Resource>cpu_Utilization</Resource>
</Target>
<conditions>
<condition>utilization less_than threshold%</condition>
</conditions>
</Rule>
<!-- For Migration : specify 1. MigrationType 2. -->
<Rule RuleId = "R7" Effect="Affinity">
<Target>
<Subject>VNF_ID</Subject>
<Action>Migration</Action>
</Target>
<conditions>
<condition>MigrationType: [Pre-Copy , Post-Copy, Hybrid]</condition>
</conditions>
</Rule>
</Policy>
</PolicySet>
</PolicySet>
AND 所需的输出 (out.xml)
<?xml version="1.0" encoding="UTF-8"?>
<PolicySet PolicySetId="PS2" PolicySetName="ResourceAdaptation" Client_Id =" ">
<PolicySet SFC_Name="">
<Policy PolicyId="p1">
<Target>
<Subject>Firewall</Subject>
</Target>
<Rule RuleId="R1" Effect="Affinity">
<Target>
<Subject>f1</Subject>
<Action>Horizontal_Scaling</Action>
<Resource>numOfInstances</Resource>
</Target>
<conditions>
<condition>min_numOfInstances: 1</condition>
<condition>max_numOfInstances: 4</condition>
</conditions>
</Rule>
<Rule RuleId="R2" Effect="Affinity">
<Target>
<Subject>f1</Subject>
<Action>Vertical_Scaling</Action>
<Resource>numOfCPUcores</Resource>
</Target>
<conditions>
<condition>min_numOfCPUcores: 4</condition>
<condition>max_numOfCPUcores: 8</condition>
</conditions>
</Rule>
<Rule RuleId = "R3" Effect="Affinity">
<Target>
<Subject>f1</Subject>
<Action>Scaling_Out</Action>
<Resource>cpu_Utilization</Resource>
</Target>
<conditions>
<condition>utilization greater_than 60%</condition>
</conditions>
</Rule>
<Rule RuleId = "R4" Effect="Affinity">
<Target>
<Subject>f1</Subject>
<Action>Scaling_In</Action>
<Resource>cpu_Utilization</Resource>
</Target>
<conditions>
<condition>utilization less_than 20%</condition>
</conditions>
</Rule>
<Rule RuleId = "R5" Effect="Affinity">
<Target>
<Subject>f1</Subject>
<Action>Migration</Action>
</Target>
<conditions>
<condition>MigrationType: Pre-Copy</condition>
</conditions>
</Rule>
<Rule RuleId="R6" Effect="Affinity">
<Target>
<Subject>f2</Subject>
<Action>Horizontal_Scaling</Action>
<Resource>numOfInstances</Resource>
</Target>
<conditions>
<condition>min_numOfInstances: 2</condition>
<condition>max_numOfInstances: 6</condition>
</conditions>
</Rule>
<Rule RuleId="R7" Effect="Affinity">
<Target>
<Subject>f2</Subject>
<Action>Vertical_Scaling</Action>
<Resource>numOfCPUcores</Resource>
</Target>
<conditions>
<condition>min_numOfCPUcores: 2</condition>
<condition>max_numOfCPUcores: 6</condition>
</conditions>
</Rule>
<Rule RuleId = "R8" Effect="Affinity">
<Target>
<Subject>f2</Subject>
<Action>Scaling_Out</Action>
<Resource>cpu_Utilization</Resource>
</Target>
<conditions>
<condition>utilization greater_than 80%</condition>
</conditions>
</Rule>
<Rule RuleId = "R9" Effect="Affinity">
<Target>
<Subject>f2</Subject>
<Action>Scaling_In</Action>
<Resource>cpu_Utilization</Resource>
</Target>
<conditions>
<condition>utilization less_than 10%</condition>
</conditions>
</Rule>
<Rule RuleId = "R10" Effect="Affinity">
<Target>
<Subject>f1</Subject>
<Action>Migration</Action>
</Target>
<conditions>
<condition>MigrationType: Post-Copy</condition>
</conditions>
</Rule>
</Policy>
<Policy PolicyId="p2">
<Target>
<Subject>Cache</Subject>
</Target>
<Rule RuleId="R11" Effect="Affinity">
<Target>
<Subject>c1</Subject>
<Action>Horizontal_Scaling</Action>
<Resource>numOfInstances</Resource>
</Target>
<conditions>
<condition>min_numOfInstances: 2</condition>
<condition>max_numOfInstances: 8</condition>
</conditions>
</Rule>
<Rule RuleId="R12" Effect="Affinity">
<Target>
<Subject>c1</Subject>
<Action>Vertical_Scaling</Action>
<Resource>numOfCPUcores</Resource>
</Target>
<conditions>
<condition>min_numOfCPUcores: 2</condition>
<condition>max_numOfCPUcores: 6</condition>
</conditions>
</Rule>
<Rule RuleId = "R13" Effect="Affinity">
<Target>
<Subject>c1</Subject>
<Action>Scaling_Out</Action>
<Resource>cpu_Utilization</Resource>
</Target>
<conditions>
<condition>utilization greater_than 90%</condition>
</conditions>
</Rule>
<Rule RuleId = "R14" Effect="Affinity">
<Target>
<Subject>c1</Subject>
<Action>Scaling_In</Action>
<Resource>cpu_Utilization</Resource>
</Target>
<conditions>
<condition>utilization less_than 30%</condition>
</conditions>
</Rule>
<Rule RuleId = "R15" Effect="Affinity">
<Target>
<Subject>f1</Subject>
<Action>Migration</Action>
</Target>
<conditions>
<condition>MigrationType: Hybrid</condition>
</conditions>
</Rule>
</Policy>
</PolicySet>
</PolicySet>
我的代码如下(.java):
public static void main(String[] args) throws SaxonApiException {
Processor proc = new Processor(false);
XsltCompiler comp = proc.newXsltCompiler();
XsltExecutable exp = comp.compile(new StreamSource(new File(
"C:/Users/eclipse-workspace/PolicyFiles_Generator_V2/src/transformation.xsl")));
Serializer out = proc.newSerializer();
out.setOutputProperty(Serializer.Property.METHOD, "xml");
out.setOutputProperty(Serializer.Property.INDENT, "yes");
out.setOutputFile(new File("output.xml"));
XsltTransformer trans = exp.load();
trans.setInitialTemplate(new QName("main"));
trans.setDestination(out);
trans.transform();
}
.xsl 代码为:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vText" select="tokenize(unparsed-text('file:///C:/Users/eclipse-workspace/PolicyFiles_Generator_V2/src/Rules_Values.txt'),'
')"/>
<xsl:template match="/">
<shirts>
<xsl:apply-templates select="document('C:/Users/Hsuwi/eclipse-workspace/PolicyFiles_Generator_V2/src/GenericTemplate.xml')"/>
<xsl:apply-templates/>
</shirts>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template name="main" match="/">
<items>
<xsl:for-each select="$vText">
<item>
...........
</xsl:for-each>
</items>
</xsl:template>
</xsl:stylesheet>
我不知道如何完成 xsl 代码以便从第一个 xml 文件中提取规则并用 .txt 文件中的值填充每个规则
有什么建议吗?帮助 ??或者是否有任何其他方法可以实现目标。 .txt 文件很灵活(这意味着我可以重新排序元素)
【问题讨论】:
-
您可能想稍微简化输入数据和结果数据以解释您需要什么,
.txt文件中的每一行是否生成相同数量的规则?我不明白文本数据和 XML 之间的关系。 -
@MartinHonnen 作为第一步,假设每一行生成相同数量的规则。输入文件和输出之间的关系如下:在.txt文件中存在的每一行都会产生一组规则。 col 3+4 给出水平缩放规则的值(例如:R1),col。 5 包含 scaling_out (R3) 的值。所以我的主要目标是生成一个新的 xml 文件,其中包含一组具有特定值的规则(规则的语法取自 generic.xml)和来自 .txt 文件的值。如果您对 txt 文件有任何其他建议??
-
你的 XML 有 7 个
Rule元素,你的文本样本有 3 个数据行,输出不应该是 3 x 7,即 21 条规则吗? -
@MartinHonnen 实际上我的 xml 文件有 5 条规则,但最后一条的 id 错误(它是 R5 而不是 R7)。所以输出文件应该包含 3 * 5 = 15 条规则
-
@MartinHonnen 从 xml 文件中提取规则语法并从 .txt 中插入值的方法是什么!