Мне нужно получить следующие значения из XML ниже. Я взял это для краткости, это идет довольно далеко. Мне нужно извлечь:
Это моя таблица стилей xslt, но я не знаю, как правильно обращаться к элементам.
<?xml version="1.0" encoding="UTF-8"?> <nr:RTPPMDataMsgV1 owner="Network Rail" timestamp="2010-08-27T13:41:04.0Z" classification="public" xsi:schemaLocation="http://xml.networkrail.co.uk/ns/2007/NR rtppm_messaging_v1.17.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://xml.networkrail.co.uk/ns/2007/EAI" xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR"> <msg:Sender application="RTPPM3" organisation="String"/> <msg:Publication> <msg:TopicID>RTPPM3/InternalPPM</msg:TopicID> </msg:Publication> <nr:RTPPMData snapshotTStamp="2010-08-27T13:41:02.0Z"> <nr:SystemMsg/> <nr:RAGThresholds type="TOC" medium="87" good="92"/> <nr:RAGThresholds type="FOC" medium="70" good="80"/> <nr:RAGThresholds type="PPT" medium="85" good="91"/> <nr:WebPPMLink>http://connect/Performance/PPM/PPMGuide.doc x</nr:WebPPMLink> <nr:PPT rag="G" ragDisplayFlag="Y">93</nr:PPT> <nr:NationalPage WebDisplayPeriod="60"> <nr:WebFixedMsg1>^<5 mins; *<10 mins</nr:WebFixedMsg1> <nr:WebFixedMsg2>The Public Performance Measure shows the performance of trains against the timetable, measured as the percentage of trains arriving at destination 'on time'. </nr:WebFixedMsg2> <nr:WebMsgOfMoment>FGW:- TCF Reading. East Coast: Unit failure Fitzwilliam.</nr:WebMsgOfMoment> <nr:StaleFlag>N</nr:StaleFlag> <nr:NationalPPM> <nr:Total>8869</nr:Total> <nr:OnTime>8393</nr:OnTime> <nr:Late>476</nr:Late> <nr:CancelVeryLate>85</nr:CancelVeryLate> <nr:PPM rag="G" ragDisplayFlag="N">94</nr:PPM> <nr:RollingPPM trendInd="-" rag="G">93</nr:RollingPPM> </nr:NationalPPM> <nr:Sector sectorDesc="London and South East" sectorCode="LSE"> <nr:SectorPPM> <nr:Total>4868</nr:Total> <nr:OnTime>4613</nr:OnTime> <nr:Late>255</nr:Late> <nr:CancelVeryLate>45</nr:CancelVeryLate> <nr:PPM rag="G">94</nr:PPM> <nr:RollingPPM trendInd="-" rag="G">93</nr:RollingPPM> </nr:SectorPPM> </nr:Sector><nr:Sector sectorDesc="Long Distance" sectorCode="LD"> <nr:SectorPPM> <nr:Total>587</nr:Total> <nr:OnTime>541</nr:OnTime> <nr:Late>46</nr:Late> <nr:CancelVeryLate>14</nr:CancelVeryLate> <nr:PPM rag="G">92</nr:PPM> <nr:RollingPPM trendInd="-" rag="A">89</nr:RollingPPM> </nr:SectorPPM> </nr:Sector><nr:Sector sectorDesc="Regional" sectorCode="REG"> <nr:SectorPPM> <nr:Total>2485</nr:Total> <nr:OnTime>2350</nr:OnTime> <nr:Late>135</nr:Late> <nr:CancelVeryLate>24</nr:CancelVeryLate> <nr:PPM rag="G">94</nr:PPM> <nr:RollingPPM trendInd="-" rag="G">93</nr:RollingPPM> </nr:SectorPPM> </nr:Sector><nr:Sector sectorDesc="Scotland" sectorCode="SCO"> <nr:SectorPPM> <nr:Total>931</nr:Total> <nr:OnTime>890</nr:OnTime> <nr:Late>41</nr:Late> <nr:CancelVeryLate>2</nr:CancelVeryLate> <nr:PPM rag="G">95</nr:PPM> <nr:RollingPPM trendInd="=" rag="G">95</nr:RollingPPM> </nr:SectorPPM> </nr:Sector><nr:Operator code="61" keySymbol="*" name="East Coast"> <nr:Total>45</nr:Total> <nr:PPM rag="R">64</nr:PPM> <nr:RollingPPM trendInd="-" displayFlag="Y" rag="R">60</nr:RollingPPM> </nr:Operator>
Используйте следующие выражения XPath :
/*/nr:RTPPMData/nr:NationalPage/nr:Operator/@name
Приведенное выше выбирает атрибут name для nr:Operator.
name
nr:Operator
/*/nr:RTPPMData/nr:NationalPage/nr:Sector/nr:SectorPPM/nr:PPM
вышеизложенное выбирает все элементы nr: PPM.
/*/nr:RTPPMData/nr:NationalPage/nr:Sector/nr:SectorPPM/nr:RollingPPM
Приведенное выше выбирает все элементы nr: RollingPPM.
Обратите внимание : Всегда старайтесь избегать сокращения // , поскольку это может стать причиной очень неэффективных выражений XPath.
//
Это показано в следующем преобразовании :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR" > <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <xsl:value-of select="/*/nr:RTPPMData/nr:NationalPage/nr:Operator/@name"/> <xsl:text>
</xsl:text> <xsl:copy-of select="/*/nr:RTPPMData/nr:NationalPage/nr:Sector/nr:SectorPPM/nr:PPM"/> <xsl:copy-of select="/*/nr:RTPPMData/nr:NationalPage/nr:Sector/nr:SectorPPM/nr:RollingPPM"/> </xsl:template> </xsl:stylesheet>
Применительно к следующему документу XML (основано на предоставленном тексте, но сделано правильно):
<nr:RTPPMDataMsgV1 owner="Network Rail" timestamp="2010-08-27T13:41:04.0Z" classification="public" xsi:schemaLocation="http://xml.networkrail.co.uk/ns/2007/NR rtppm_messaging_v1.17.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://xml.networkrail.co.uk/ns/2007/EAI" xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR"> <msg:Sender application="RTPPM3" organisation="String"/> <msg:Publication> <msg:TopicID>RTPPM3/InternalPPM</msg:TopicID> </msg:Publication> <nr:RTPPMData snapshotTStamp="2010-08-27T13:41:02.0Z"> <nr:SystemMsg/> <nr:RAGThresholds type="TOC" medium="87" good="92"/> <nr:RAGThresholds type="FOC" medium="70" good="80"/> <nr:RAGThresholds type="PPT" medium="85" good="91"/> <nr:WebPPMLink>http://connect/Performance/PPM/PPMGuide.doc x</nr:WebPPMLink> <nr:PPT rag="G" ragDisplayFlag="Y">93</nr:PPT> <nr:NationalPage WebDisplayPeriod="60"> <nr:WebFixedMsg1>^<5 mins; *<10 mins</nr:WebFixedMsg1> <nr:WebFixedMsg2>The Public Performance Measure shows the performance of trains against the timetable, measured as the percentage of trains arriving at destination 'on time'. </nr:WebFixedMsg2> <nr:WebMsgOfMoment>FGW:- TCF Reading. East Coast: Unit failure Fitzwilliam.</nr:WebMsgOfMoment> <nr:StaleFlag>N</nr:StaleFlag> <nr:NationalPPM> <nr:Total>8869</nr:Total> <nr:OnTime>8393</nr:OnTime> <nr:Late>476</nr:Late> <nr:CancelVeryLate>85</nr:CancelVeryLate> <nr:PPM rag="G" ragDisplayFlag="N">94</nr:PPM> <nr:RollingPPM trendInd="-" rag="G">93</nr:RollingPPM> </nr:NationalPPM> <nr:Sector sectorDesc="London and South East" sectorCode="LSE"> <nr:SectorPPM> <nr:Total>4868</nr:Total> <nr:OnTime>4613</nr:OnTime> <nr:Late>255</nr:Late> <nr:CancelVeryLate>45</nr:CancelVeryLate> <nr:PPM rag="G">94</nr:PPM> <nr:RollingPPM trendInd="-" rag="G">93</nr:RollingPPM> </nr:SectorPPM> </nr:Sector> <nr:Sector sectorDesc="Long Distance" sectorCode="LD"> <nr:SectorPPM> <nr:Total>587</nr:Total> <nr:OnTime>541</nr:OnTime> <nr:Late>46</nr:Late> <nr:CancelVeryLate>14</nr:CancelVeryLate> <nr:PPM rag="G">92</nr:PPM> <nr:RollingPPM trendInd="-" rag="A">89</nr:RollingPPM> </nr:SectorPPM> </nr:Sector> <nr:Sector sectorDesc="Regional" sectorCode="REG"> <nr:SectorPPM> <nr:Total>2485</nr:Total> <nr:OnTime>2350</nr:OnTime> <nr:Late>135</nr:Late> <nr:CancelVeryLate>24</nr:CancelVeryLate> <nr:PPM rag="G">94</nr:PPM> <nr:RollingPPM trendInd="-" rag="G">93</nr:RollingPPM> </nr:SectorPPM> </nr:Sector> <nr:Sector sectorDesc="Scotland" sectorCode="SCO"> <nr:SectorPPM> <nr:Total>931</nr:Total> <nr:OnTime>890</nr:OnTime> <nr:Late>41</nr:Late> <nr:CancelVeryLate>2</nr:CancelVeryLate> <nr:PPM rag="G">95</nr:PPM> <nr:RollingPPM trendInd="=" rag="G">95</nr:RollingPPM> </nr:SectorPPM> </nr:Sector> <nr:Operator code="61" keySymbol="*" name="East Coast"> <nr:Total>45</nr:Total> <nr:PPM rag="R">64</nr:PPM> <nr:RollingPPM trendInd="-" displayFlag="Y" rag="R">60</nr:RollingPPM> </nr:Operator> </nr:NationalPage> </nr:RTPPMData> </nr:RTPPMDataMsgV1>
желаемый, правильный результат выдается :
East Coast <nr:PPM xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://xml.networkrail.co.uk/ns/2007/EAI" rag="G">94</nr:PPM> <nr:PPM xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://xml.networkrail.co.uk/ns/2007/EAI" rag="G">92</nr:PPM> <nr:PPM xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://xml.networkrail.co.uk/ns/2007/EAI" rag="G">94</nr:PPM> <nr:PPM xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://xml.networkrail.co.uk/ns/2007/EAI" rag="G">95</nr:PPM> <nr:RollingPPM xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://xml.networkrail.co.uk/ns/2007/EAI" trendInd="-" rag="G">93</nr:RollingPPM> <nr:RollingPPM xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://xml.networkrail.co.uk/ns/2007/EAI" trendInd="-" rag="A">89</nr:RollingPPM> <nr:RollingPPM xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://xml.networkrail.co.uk/ns/2007/EAI" trendInd="-" rag="G">93</nr:RollingPPM> <nr:RollingPPM xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://xml.networkrail.co.uk/ns/2007/EAI" trendInd="=" rag="G">95</nr:RollingPPM>
Таблица стилей ниже демонстрирует базовое использование, которое может вам помочь. Помните, что вам нужно объявить префиксы пространства имен, которые вы используете, например nr: ниже.
nr:
(На практике вы, вероятно, не хотите использовать // для поиска всех потомков корня документа, вместо этого вы будете обращаться к элементам относительно текущего узла контекста.)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:nr="http://xml.networkrail.co.uk/ns/2007/NR"> <xsl:output method="text"/> <xsl:template match="/"> operator name: <xsl:value-of select="//nr:Operator/@name"/> ppm: <xsl:value-of select="//nr:PPM"/> rolling ppm: <xsl:value-of select="//nr:RollingPPM"/> </xsl:template> </xsl:stylesheet>