首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT:从XML文件中提取元素集,并从txt文件中获取值

XSLT:从XML文件中提取元素集,并从txt文件中获取值
EN

Stack Overflow用户
提问于 2018-09-12 11:36:57
回答 1查看 62关注 0票数 0

我有两个文件: Rules_Generic文件(generic.xml)和(Rules_Values.txt)。我想通过从generic.xml中提取规则语法并从Rules_Values.txt中填充值来找到一种方法来编写新的XML文件

我搜索了一下,发现可以使用XSLT。以下是(Rules_Values.txt)

代码语言:javascript
复制
#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)

代码语言:javascript
复制
<?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>

和所需的输出(out.xml)

代码语言:javascript
复制
<?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):

代码语言:javascript
复制
    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代码为:

代码语言:javascript
复制
<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文件很灵活(这意味着我可以对元素重新排序)

EN

回答 1

Stack Overflow用户

发布于 2018-09-12 15:42:50

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

代码语言:javascript
复制
  <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>

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

代码语言:javascript
复制
<?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>

出于完整性和紧凑性的考虑,本例使用了一个字符串参数,但当然也可以使用<xsl:param name="data" select="unparsed-text('file.txt')"/>

在线样本在https://xsltfiddle.liberty-development.net/bFDb2CH

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52287135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档