Ich habe Schwierigkeiten, meinen Kopf um die Syntax zu wickeln, die ich brauche, um ein Element zu erstellen, das ich möchte. Brandneu zu XML/XSLT und nicht sicher, ob dies der richtige Ansatz ist.Erstellen eines Elements basierend auf einer doppelten Bedingung mit XSLT
Ich versuche, meine XML-Datei in element-centric zu analysieren, so dass ich die Daten in einer lesbaren Struktur in einer Access-Datenbank formatieren kann.
Ich versuche, einen Datenwert aus einem Element basierend auf zwei Bedingungen zu ziehen.
Die Daten befinden sich in einem Element namens 'Reading' und die Daten sind mit 'value' gekennzeichnet. Über dem Element 'Reading' befindet sich das definierende Element 'ConsumptionSpec'.
Was ich zu testen versucht, ist das, was Maßeinheit (UOM) die aktuelle ‚ConsumptionSpec‘ eingeschaltet ist, und dann testen Sie ein anderes Attribut mit dem Namen ‚TouBucket‘, die entweder den Wert "hält TierA ',' TierB '/ C/D oder Total. Der UOM kann "kWh, kW, kVAh oder kVA" speichern. Ich versuche, den ersten auszulegen, während ich diesen Test wiederhole, um Elemente für jedes Tier (A bis D) und das Total zu machen. (Der Versuch, wie klar eine Erklärung zu geben, wie ich kann)
Derzeit Ich versuche xsl zu verwenden: foreach- die ConsumptionSpec rechts oben Lesen zu wählen, und dann xsl: wenn das zu testen UOM und TouBucket separat. Nach dem Test erstelle ich ein Element und versuche, den Wert des aktuellen Elements Reading zu ziehen.
Hier ist ein Auszug aus meinem XML, damit Sie sehen können, welche Werte ich während des Testens durchlaufen möchte.
<MeterReadings Irn="Null" Source="Remote" SourceName="Null" SourceIrn="Null" Initiator="Schedule" Purpose="Null" CollectionTime="2017-04-01 09:00:00" >
<Meter MeterIrn="Null" MeterName="Null" IsActive="true" SerialNumber="Null" MeterType="A3_ILN" Description="" InstallDate="2017-01-21 05:00:00" RemovalDate="" AccountIdent="Null" AccountName="" SdpIdent="" Location="Null" TimeZoneIndex="Null" Timezone="Null" TimeZoneOffset="300" ObservesDaylightSavings="false" MediaType="900 MHz" />
<ReadingQualityIndicator Name="Tamper Alert" Value="true" />
<ConsumptionData >
<ConsumptionSpec UOM="kWh" Direction="Delivered" TouBucket="Total" MeasurementPeriod="Current" Multiplier="1" />
<Reading TimeStamp="2017-04-01 03:08:00" Value="902" />
</ConsumptionData>
<ConsumptionData >
<ConsumptionSpec UOM="kWh" Direction="Delivered" TouBucket="TierA" MeasurementPeriod="Current" Multiplier="1" />
<Reading TimeStamp="2017-04-01 03:08:00" Value="0" />
</ConsumptionData>
<ConsumptionData >
<ConsumptionSpec UOM="kWh" Direction="Delivered" TouBucket="TierB" MeasurementPeriod="Current" Multiplier="1" />
<Reading TimeStamp="2017-04-01 03:08:00" Value="0" />
</ConsumptionData>
<ConsumptionData >
<ConsumptionSpec UOM="kWh" Direction="Delivered" TouBucket="TierC" MeasurementPeriod="Current" Multiplier="1" />
<Reading TimeStamp="2017-04-01 03:08:00" Value="902" />
</ConsumptionData>
<ConsumptionData >
<ConsumptionSpec UOM="kWh" Direction="Delivered" TouBucket="TierD" MeasurementPeriod="Current" Multiplier="1" />
<Reading TimeStamp="2017-04-01 03:08:00" Value="0" />
</ConsumptionData>
Und hier ist meine aktuelle XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<!-- BY DEFAULT, elements and text nodes are copied,
and elements' attributes and contents are transformed as child nodes
of the output element -->
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- By default, attributes are transformed to elements -->
<xsl:template match="@*">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<!-- Certain elements have only their contents transformed -->
<xsl:template match="
Meter | Status | ConsumptionData |
Statuses | MaxDemandData | MaxDemandSpec |
InstrumentationValue | IntervalData | IntervalSpec">
<!-- no xsl:copy, and attribute children, if any, are ignored -->
<xsl:apply-templates select="@* | node()"/>
</xsl:template>
<!--
Applies an extra element tag to the selected match
and pulls the value from the MeterReading ancestor it's
tagged under.
-->
<xsl:template match="Reading">
<xsl:copy>
<xsl:element name="MeterReadingIRN">
<xsl:value-of select="ancestor::MeterReadings/@Irn"/>
</xsl:element>
<!--
Trying to get into the ConsumptionSpec tag it's related to,
then test what the unit of measurement is (UOM),
and then test what 'TouBucket' it is a part of (TierA/B/C/D or Total),
and THEN create a new element so that I can hold the 'value' that is inside
the Reading element, so that it will be referenced to that specific UOM.
-->
<xsl:for-each select="ancestor::ConsumptionSpec">
<xsl:choose>
<xsl:when test="@UOM='kWh'">
<xsl:when test="@TouBucket='Total'">
<xsl:element name="kWhTotal">
<xsl:value-of select="Reading/@Value"/>
</xsl:element>
</xsl:when>
</xsl:when>
<!-- Not sure how I can make my otherwise into a useful element here -->
<xsl:otherwise>
<xsl:element name="BlankTest">
<xsl:value-of select="ancestor::MeterReadings/@Irn"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Channel">
<xsl:copy>
<xsl:element name="MeterReadingIRN">
<xsl:value-of select="ancestor::MeterReadings/@Irn"/>
</xsl:element>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Sämtliche Vorschläge werden geschätzt, wurde mein Kopf gegen diese von Osterwochen hämmern! Lassen Sie es mich wissen, wenn es mehr Informationen gibt, die ich bereitstellen kann, um es verständlicher zu machen.
Beiseite: in der Vorlage kommentiert mit "bestimmte Elemente haben nur ihre Inhalte umgewandelt", Sie sind in der Tat Umwandlung übereinstimmende Elemente Attribute, scheinbar im Gegensatz zu Ihrer Absicht. Sie transformieren auch Text-, Kommentar- und Verarbeitungskinder, nicht nur untergeordnete Elemente, falls sich das von dem unterscheidet, was Sie beabsichtigt haben. –
In jedem Fall ist es nicht klar, welche Ausgabe Sie hoffen, entweder für diesen speziellen Fall oder für den allgemeineren, den Sie hoffen, schließlich zu handhaben. Versuchen Sie gerade, Elementnamen dynamisch aus der entsprechenden UOM und TouBucket zu erstellen? –