XSLT节点值比较

时间:2013-12-23 07:56:45

标签: xslt

如何将ip地址与家庭和姓名的引用进行比较。使用XSLT文件。在详细信息中,我有一个xml文件,其中包含操作符节点列表,每个操作员站都有其唯一的信息。因此,通过考虑第一个运算节点作为主节点来比较所有剩余的从属运营商站信息。首先需要通过分组Family&来比较IPAddress。给出如下所示结果的名称。所以我正在寻找starnsform脚本XSLT,它给出了如下所示的结果。   请检查我用作输入的xml文件,xml文件,因为我期待输出结果和我正在处理的XSLT文件。
如果有人还不理解,请询问问题.... 输入xml文件

<?xml version="1.0" encoding="utf-8"?>
<OperatorStationCollection xmlns="http://ACORD.org/Standards/Life/2">
  <OperatorStation><Name>OS01</Name>
    <Nodes>
      <DataNodeBase >
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.3</IPAddress>  
      </DataNodeBase>
    </Nodes>
  </OperatorStation>
  <OperatorStation><Name>OS02</Name>
    <Nodes>
          <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.3</IPAddress>  
          </DataNodeBase>
    </Nodes>
  </OperatorStation>
  <OperatorStation><Name>OS03</Name>
    <Nodes>
          <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
          </DataNodeBase>
    </Nodes>
  </OperatorStation>
  <OperatorStation><Name>OS04</Name>
    <Nodes>
        <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
        </DataNodeBase>
    </Nodes>
  </OperatorStation>
</OperatorStationCollection>

预期输出:

<?xml version="1.0" encoding="utf-8"?> 
<OperatorStationCollection > 
  <Result > 
    <Family>NetworkSettings</Family> 
    <AdaptorName>Internet</AdaptorName> 
    <os01>111.22.22.3</os01> 
    <os02>Equal</os02> 
    <os03>UnEqual</os03> 
    <os04>UnEqual</os04> 
  </Result > 
</OperatorStationCollection>

我想添加的脚本:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns="http://ACORD.org/Standards/Life/2" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kOperatorStation" match="OperatorStation" use="concat(Family,'#',Name)"/>
<xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="/*">
  <xsl:copy>
    <xsl:for-each select="OperatorStation[generate-id() = generate-id(key('kOperatorStation',concat(Family,'#',Name))[1])]" >
      <xsl:copy>
        <xsl:variable name="group" select="key('kOperatorStation',concat(current()/Family,'#',current()/Name))" />
        <xsl:for-each select= "$group" >
          <xsl:if test="position() = 1">
            <xsl:apply-templates select="*[local-name() != 'IPAddress']" />            
          </xsl:if>
        </xsl:for-each>
      </xsl:copy>
    </xsl:for-each>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

c#代码用于转换:

XmlReader objXmlReader = XmlReader.Create(@"C:\XMLFile1.xml");
            /*Transform and add arguments*/
            XmlReader xsltTransformReader= XmlReader.Create(@"C:\XSLTFile1.xslt");
            XslCompiledTransform objXslTransform = new XslCompiledTransform();
            objXslTransform.Load(xsltTransformReader);

           XmlWriterSettings settings = new XmlWriterSettings();
        settings.Encoding = Encoding.UTF8;

        /*Do transformation*/
        StringBuilder output = new StringBuilder();
        using (XmlWriter xw = XmlWriter.Create(new StringWriter(output), settings))
            {
                objXslTransform.Transform(objXmlReader, xw);             
                string result = output.ToString();
            }

1 个答案:

答案 0 :(得分:0)

我终于理解了这个问题。

以下样式表会根据位于OperatorStation内的FamilyName元素对Nodes/DataNodeBase元素进行分组。请注意,还有另一个Name元素是OperatorStation的直接子元素 - 这可能会造成混淆。

对于每个组,列出第一个IPAddress元素,并将其他元素与之进行比较。这些结果元素的名称取自(顶部)Name元素的值(只是为了增加一些混淆......)。

特别注意处理源XML文档中声明的命名空间。

<强> Styleheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://ACORD.org/Standards/Life/2"
exclude-result-prefixes="ns"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="kOperatorStation" match="ns:OperatorStation" use="concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name)"/>

<xsl:template match="/">
<OperatorStationCollection>
    <xsl:for-each select="ns:OperatorStationCollection/ns:OperatorStation[generate-id() = generate-id(key('kOperatorStation',concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name))[1])]" >
    <Result>
        <Family><xsl:value-of select=".//ns:Family"/></Family>
        <AdaptorName><xsl:value-of select=".//ns:DataNodeBase/ns:Name"/></AdaptorName>

        <xsl:variable name="ip" select=".//ns:IPAddress" />

        <xsl:for-each select="key('kOperatorStation', concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name))" >  
                <xsl:element name="{ns:Name}">
                    <xsl:choose>
                        <xsl:when test="position()=1">
                            <xsl:value-of select="$ip"/>
                        </xsl:when>
                        <xsl:when test=".//ns:IPAddress=$ip">
                            <xsl:text>Equal</xsl:text>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:text>UnEqual</xsl:text>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:element>
        </xsl:for-each>
    </Result> 
    </xsl:for-each>
</OperatorStationCollection>
</xsl:template>
</xsl:stylesheet>

源XML:

<?xml version="1.0" encoding="utf-8"?>
<OperatorStationCollection xmlns="http://ACORD.org/Standards/Life/2">
    <OperatorStation>
        <Name>OS01</Name>
        <Nodes>
            <DataNodeBase >
                    <Family>NetworkSettings</Family>
                    <Name>Internet</Name>
                    <IPAddress>111.22.22.3</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>  
    <OperatorStation>
        <Name>OS02</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.3</IPAddress>  
            </DataNodeBase>
        </Nodes>
        </OperatorStation>      
        <OperatorStation>
        <Name>OS03</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>      
    <OperatorStation>
        <Name>OS04</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>
</OperatorStationCollection>

<强>结果:

<?xml version="1.0" encoding="utf-8"?>
<OperatorStationCollection>
  <Result>
    <Family>NetworkSettings</Family>
    <AdaptorName>Internet</AdaptorName>
    <OS01>111.22.22.3</OS01>
    <OS02>Equal</OS02>
    <OS03>UnEqual</OS03>
    <OS04>UnEqual</OS04>
  </Result>
</OperatorStationCollection>