2016-07-27 69 views
1

我對XSLT非常陌生,這個示例看起來像是一種很好的學習方式,但是對我來說生活卻無法實現。我試圖並行標記化2個不同的字符串,並將它們組合成一個JSON數組。所以我想記號化measTypes [0]和匹配,以measResults [0],然後measTypes [1]和匹配measResults [1],等等如何在XSLT 2.0中應用並行模板定義

示例XML

<?xml version="1.0" encoding="UTF-8"?> 
 
<measInfo measInfoId="1542455297"> 
 
    <measTypes>1542455297 1542455298 1542455299 1542455300 1542455301 1542455302 1542455303 1542455304 1542455305 1542455306 1542455307 1542460296 1542460297 </measTypes> 
 
    <measValue measObjLdn="LTHAB0113422/ETHPORT:Cabinet No.=0, Subrack No.=1, Slot No.=7, Port No.=0, Subboard Type=BASE_BOARD"> 
 
     <measResults>116967973 585560 496041572 682500 0 12583680 72080 520454 46670568 73432 2205837 1000000 1000000 </measResults> 
 
    </measValue> 
 
    <measValue measObjLdn="LTHAB0113422/ETHPORT:Cabinet No.=0, Subrack No.=1, Slot No.=7, Port No.=1, Subboard Type=BASE_BOARD"> 
 
     <measResults>0 0 0 0 0 0 0 0 0 0 0 0 0 </measResults> 
 
    </measValue> 
 
</measInfo>

XSLT 2.0,我至今

<?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」 exclude-result-prefixes=「xs" version="2.0"> 
 
    <xsl:output method="text" encoding="UTF-8" media-type="text/plain"/> 
 
    <xsl:strip-space elements="*"/> 
 
    <!-- 
 
    <xsl:template match="/measInfo/measValue/measResults" name="measRes"> 
 
      <xsl:for-each select="."> 
 
      {'measResult':{<xsl:value-of select="tokenize(normalize-space(.),'\s+')"/>} 
 
     </xsl:for-each> 
 
    </xsl:template> 
 
    --> 
 
    <xsl:template match="/" name="measObj"> 
 
     [ 
 
      <xsl:for-each select="measInfo/measValue"> 
 
      'measObjLdn':'<xsl:value-of select="@measObjLdn"/>' 
 
      <xsl:call-template name="types"/> 
 
      </xsl:for-each> 
 
     ] 
 
     <xsl:apply-templates /> 
 
    </xsl:template> 
 
    <xsl:template match="/measInfo" name="types" > 
 
      'Metrics':[ 
 
      <xsl:for-each select="tokenize(normalize-space(measTypes),'\s+')"> 
 
       {'measType':'<xsl:value-of select="."/>'},<!-- <xsl:call-template name="measRes"/> --> 
 
      </xsl:for-each> 
 
      ] 
 
    </xsl:template> 
 
</xsl:stylesheet>

的JSON結果,我希望

[ 
 
      'measObjLdn':"LTHAB0113422/ETHPORT:Cabinet No.=0, Subrack No.=1, Slot No.=7, Port No.=0, Subboard Type=BASE_BOARD", 
 
      'Metrics':[ 
 
       {'measType':'1542455297','measResult':116967973}, 
 
       {'measType':'1542455298','measResult':585560}, 
 
       {'measType':'1542455299','measResult':496041572}, 
 
       {'measType':'1542455300','measResult':682500}, 
 
       {'measType':'1542455301','measResult':0}, 
 
       {'measType':'1542455302','measResult':12583680}, 
 
       {'measType':'1542455303','measResult':72080}, 
 
       {'measType':'1542455304','measResult':520454}, 
 
       {'measType':'1542455305','measResult':46670568}, 
 
       {'measType':'1542455306','measResult':73432}, 
 
       {'measType':'1542455307','measResult':2205837}, 
 
       {'measType':'1542460296','measResult':1000000}, 
 
       {'measType':'1542460297','measResult':1000000} 
 
      ] 
 
      'measObjLdn':"LTHAB0113422/ETHPORT:Cabinet No.=0, Subrack No.=1, Slot No.=7, Port No.=1, Subboard Type=BASE_BOARD", 
 
      'Metrics':[ 
 
       {'measType':'1542455297','measResult':0}, 
 
       {'measType':'1542455298','measResult':0}, 
 
       {'measType':'1542455299','measResult':0}, 
 
       {'measType':'1542455300','measResult':0}, 
 
       {'measType':'1542455301','measResult':0}, 
 
       {'measType':'1542455302','measResult':0}, 
 
       {'measType':'1542455303','measResult':0}, 
 
       {'measType':'1542455304','measResult':0}, 
 
       {'measType':'1542455305','measResult':0}, 
 
       {'measType':'1542455306','measResult':0}, 
 
       {'measType':'1542455307','measResult':0}, 
 
       {'measType':'1542460296','measResult':0}, 
 
       {'measType':'1542460297','measResult':0} 
 
      ] 
 
     ]

+0

' 'measObjLdn':{LTHAB0113422/ETHPORT:內閣號= 0'並不像JSON來我。 –

+0

對不起,太多的剪切和粘貼所有的代碼片段。現在應該是正確的 – Hans

+0

您需要編寫一個模板或函數,以兩個序列作爲參數,然後爲每個序列中的第一個項目對創建JSON對象文本,並在序列的尾部分別調用模板函數。 XPath 3.0具有「for-each-pair」功能,但您當然可以在自己的函數中實現它。 https://www.w3.org/TR/xpath-functions-31/#func-for-each-pair –

回答

0

這裏是處理兩個序列兩兩的一種方式:

<?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:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="2.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output media-type="text"/> 

    <xsl:template match="measInfo"> 
     <xsl:variable name="types" select="tokenize(normalize-space(measTypes), '\s+')"/> 
     [ 
      <xsl:apply-templates select="measValue"> 
      <xsl:with-param name="types" select="$types"/> 
      </xsl:apply-templates> 
     ] 
    </xsl:template> 

    <xsl:template match="measValue"> 
     <xsl:param name="types"/> 
     { 'measObjLdn' : '<xsl:value-of select="@measObjLdn"/>' }, 
     <xsl:variable name="values" select="tokenize(normalize-space(), '\s+')"/> 
      'Metrics' : 
      [ 
      <xsl:for-each select="$types"> 
       <xsl:variable name="pos" select="position()"/> 
       <xsl:if test="$pos > 1">, 
       </xsl:if> 
       { 'measTypes' : '<xsl:value-of select="."/>', 'measResult' : '<xsl:value-of select="$values[$pos]"/>' } 
      </xsl:for-each> 
      ] 
    </xsl:template> 

</xsl:stylesheet> 

輸出不能很好地格式化,但你應該能夠改善你自己使用xsl:text

1

的XPath 3.0(以及XSLT 3.0)的功能,你可以結合起來,做到這本:

<xsl:value-of select="for-each-pair(tokenize(measTypes), tokenize(measInfo/measValue), function($t, $v) { 
    serialize(map{'measType':$t, 'measValue':$v}, map{'method':'json'}) 
})" separator=",&#a;"/>