读取XML文件并将其用于XSLT中的第二个XML

时间:2014-11-17 16:08:15

标签: xslt

我想获取operators.xml中关键字段的值,然后将其值与roles.xml中的开始/结束范围进行比较,然后添加角色元素并指定适当的值。

键107落在1到499的范围内,这是用户开始和结束之间。因此ID被分配给用户角色。角色的名称,即用户或经理,可以是硬编码的。

这是一个说明我的问题的例子。我想很多人可以使用这个问题来获得类似功能的参考。

roles.xml

<OperatorRange>
    <Role>
        <node_id>1</node_id>
        <user_start>1</user_start>
        <user_end>499</user_end>
        <manager_start>500</manager_start>
        <manager_end>699</manager_end>
        <training_start>700</training_start>
        <training_end>799</training_end>
    </Role>
    <Role>
        <node_id>2</node_id>
        <user_start>0</user_start>
        <user_end>0</user_end>
        <manager_start>0</manager_start>
        <manager_end>0</manager_end>
        <training_start>0</training_start>
        <training_end>0</training_end>
    </Role>  
</OperatorRange>

operators.xml

<Operators>
    <Opeartor>
        <key>107</key>
        <name>John Smith</name>
    </Opeartor>
    <Opeartor>
        <key>607</key>
        <name>Brad Johnson</name>
    </Opeartor>  
</Operators>

预期结果

<Operators>
    <Opeartor>
        <key>107</key>
        <name>John Smith</name>
        <role>user</role>
        </Opeartor>
    <Opeartor>
        <key>607</key>
        <name>Brad Johnson</name>
        <role>manager</role>
    </Opeartor>
</Operators>

1 个答案:

答案 0 :(得分:0)

我假设你的xml是这样的,因为你的“roles.xml”有一些错误:

<?xml version="1.0" encoding="UTF-8"?>
<OperatorRange>
  <Role>
    <node_id>1</node_id>
    <user_start>1</user_start>
    <user_end>499</user_end>
    <manager_start>500</manager_start>
    <manager_end>699</manager_end>
    <training_start>700</training_start>
    <training_end>799</training_end>
  </Role>
  <Role>
    <node_id>2</node_id>
    <user_start>1</user_start>
    <user_start>499</user_start>
    <manager_start>500</manager_start>
    <manager_end>699</manager_end>
    <training_start>700</training_start>
    <training_end>799</training_end>
  </Role>
</OperatorRange>

您没有为输出xml的“角色”节点提供任何逻辑。因此,这留给你。试试这个xslt:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:MyUtils="pda:MyUtils">
  <xsl:template match="/">
    <Operators>
      <xsl:variable name="operators" select="Operators//Opeartor"/>
      <xsl:variable name="roles" select="MyUtils:getSecondXMLData()"/>
      <xsl:for-each select="$operators">
        <xsl:variable name="curnode" select="position()"/>
        <xsl:for-each select="$roles/Role">
          <xsl:if test="$curnode=node_id and $operators[$curnode]/key &lt;=user_end and $operators[$curnode]/key &gt;=user_start">
            <Opeartor>
              <key>
                <xsl:value-of select="$operators[$curnode]/key"/>
              </key>
              <name>
                <xsl:value-of select="$operators[$curnode]/name"/>
              </name>
              <role></role>
            </Opeartor>
          </xsl:if>
        </xsl:for-each>
      </xsl:for-each>
    </Operators>
  </xsl:template>
</xsl:stylesheet>

希望有所帮助。