【问题标题】:XSLT: extract set of elements from XML file and get the values from txt fileXSLT:从 XML 文件中提取元素集并从 txt 文件中获取值
【发布时间】: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'),'&#xa;')"/>

  <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 中插入值的方法是什么!

标签: xml xslt text


【解决方案1】:

您的问题中有太多太多不同的样本数据无法准确回答,但正如评论中所说,我想知道是否以及定义命名模板或函数的方法将您要填充的值的数量作为命名参数,例如

  <xsl:function name="mf:fill-template" as="element(Policy)">
      <xsl:param name="p1"/>
      <xsl:param name="p2"/>
      <xsl:param name="p3"/>
      <Policy xsl:expand-text="yes">
          <Rule>
              <foo>test {$p2}</foo>
          </Rule>
          <Rule att="{$p1}">
              ...
          </Rule>
          <Rule>
              <header>...</header>
              <value>... {$p3}</value>
          </Rule>
      </Policy>
  </xsl:function>

然后根据需要为文本中的每一行调用该函数,例如

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:mf="http://example.com/mf"
    exclude-result-prefixes="#all"
    version="3.0">


  <xsl:function name="mf:fill-template" as="element(Policy)">
      <xsl:param name="p1"/>
      <xsl:param name="p2"/>
      <xsl:param name="p3"/>
      <Policy xsl:expand-text="yes">
          <Rule>
              <foo>test {$p2}</foo>
          </Rule>
          <Rule att="{$p1}">
              ...
          </Rule>
          <Rule>
              <header>...</header>
              <value>... {$p3}</value>
          </Rule>
      </Policy>
  </xsl:function>

  <xsl:param name="data" as="xs:string">P1  P2  P3
a b c
c d f
g h i</xsl:param>

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/">
    <PolicySet>
        <xsl:for-each select="tail(tokenize($data, '\r?\n'))">
            <xsl:sequence select="let $args := tokenize(., '\s+') return mf:fill-template($args[1], $args[2], $args[3])"/>
        </xsl:for-each>
    </PolicySet>
  </xsl:template>

</xsl:stylesheet>

为了完整性和紧凑性,该示例使用字符串参数,但您当然可以使用&lt;xsl:param name="data" select="unparsed-text('file.txt')"/&gt;

在线示例位于https://xsltfiddle.liberty-development.net/bFDb2CH

不确定这是否有帮助,但将该建议塞进评论会相当困难。

我意识到我没有处理您的输入 XML,而是假设您能够调整它并使用它的模板/序列构造函数构造一个函数。可能会自动执行此操作,但目前我不知道如何将各种列名与 XML 示例中文本位置的不同和变量进行匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多