Mam XML z wieloma węzłami z podobnymi danymi w każdym. Chcę usunąć określony atrybut z każdego węzła (USER: IPADDRESS). Mam zorientowali się, jak łańcuch razem szereg elementów przy użyciu RNO prostu opuszczając user = „{@} użytkownika” mecz, więc nie pojawiają się w wynikach:XSLT: użyj wielu lub więcej szablonów do zastosowania-szablonów
XSL Snippet:
<xsl:template match="Creation | Test | Assignment | Modification | Repair | Termination">
<Creation CommitID="{@CommitID}" Date="{@Date}" BoardID="{@BoardID}">
<xsl:apply-templates/>
</Creation>
</xsl:template>
Jak można się domyślić, wszystkie nazwy węzłów po "Creation" zostają ponownie nazwane Creation, ponieważ właśnie to mam zamiar zrobić. Jak przekazać różne mecze, aby zostały one zastosowane we właściwej kolejności w wynikach? Wiem, że potrafię zrobić brutalną siłę używając identycznych instrukcji XSL dla każdego z różnych meczów (tak to zrobiłem za pierwszym razem), ale musi być bardziej elegancka metoda, po prostu mnie unika. Mam miliony & milionów linii XML do przetworzenia i jest to tylko pierwsza z wielu transformacji, które będę musiał wykonać.
Używam msxsl V4.0 na polu Win7, aby wykonać moje transformacje, jeśli ma to jakiekolwiek znaczenie.
XML:
<?xml version="1.0"?>
<BoardDatabase>
<Board_Data BoardID="1035">
<Creation CommitID="12b" Date="2007-12-07T15:43:51" BoardID="1035" User="CSAGAN:192.168.1.177">
<BoardDrawing>3B</BoardDrawing>
<AssemblyDrawing>2010F</AssemblyDrawing>
<Notes>PO Num 1959</Notes>
</Creation>
<Test CommitID="117" Date="2007-12-10T10:39:43" BoardID="1035" User="CSAGAN:192.168.1.183">
<ElectricalTestData Result="FAIL" Version="IMM STD REVF">
<AutomatedTest ReportVersion="1.0">
<TestSetup>
<TestAppBuildDate>Dec 07 2007</TestAppBuildDate>
<VersionPath>c:\tests\versions\v12.txt</VersionPath>
<VersionNumber>1.2</VersionNumber>
<OperatorName>CSAGAN</OperatorName>
<StationID>PC-191-NDGrasse</StationID>
<JigSN>12345</JigSN>
<JigAssembly>42</JigAssembly>
<TestStartTime>2007-12-10 10:34:17</TestStartTime>
</TestSetup>
</AutomatedTest>
</ElectricalTestData>
</Test>
<Assignment CommitID="1c1f" User="JRandi:192.168.1.162" Date="2008-09-30T07:36:52" BoardID="1035">
<Notes>Boardset failed etest twice, no problem log entry/repair attempts made.</Notes>
</Assignment>
<Modification CommitID="2bb7" User="JRandi:192.168.1.162" Date="2009-03-11T13:31:21" BoardID="1035">
<AssemblyDrawing>2001G</AssemblyDrawing>
<Notes>Cornelius upgraded boardset to rev. G</Notes>
</Modification>
</Board_Data>
</BoardDatabase>
XSL:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="Creation | Test | Assignment | Modification | Repair | Termination">
<Creation CommitID="{@CommitID}" Date="{@Date}" BoardID="{@BoardID}">
<xsl:apply-templates/>
</Creation>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Najnowsze XSL przy użyciu @ rozwiązania DevNull że podwaja rozmiar oryginalnego pliku:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- Answer from Stack Overflow that only strips out the IP Address from the User attribute. -->
<xsl:template match="@User">
<xsl:attribute name="User">
<xsl:value-of select="substring-before(.,':')"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Najnowsze XSL od @ rozwiązania Dimitre że trwa bardzo długi czas przetwarzania (nadal trwa po ponad 30 minutach, ale plik wciąż rośnie):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"*[contains('|Creation|Test|Assignment|Modification|Repair|Termination|',concat('|', name(), '|'))
]/@user"/>
</xsl:stylesheet>
+1 Ładnie napisane pytanie. –
Dobre pytanie, +1. Być może zainteresuje Cię nieco lepsze rozwiązanie, które jest krótsze i można je przystosować do nieskończenie długiej listy nazw elementów - które nawet mogłyby zostać przekazane jako parametr transformacji. –