2014-01-09 4 views
-1

Я создал простой XSL-файл, который выполняет преобразование в файле XML. Теперь преобразование возвращает True или False (в зависимости от результата теста), если прошло = true, fail = false. Теперь я хочу добавить дополнительный тег в свой XML с этими значениями Я видел сообщение this и попытался адаптировать его к моей проблеме, однако он не совсем сработал.Как добавить элемент в XML через XSL

Мой файл XML изначально выглядит следующим образом

<?xml version="1.0" encoding="iso-8859-1"?> 
<message> 
    <unique-id>unique-id</unique-id> 
    <payload> 
     <Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://mappings.f4f.com/F4FXML/Schemas/v5/financial.xsd"> 
     <EnvelopeHeader> 
      <SchemaVersion>5.1</SchemaVersion> 
      <EnvelopeCreated>20140108</EnvelopeCreated> 
      <EnvelopeTrackingID>1746978</EnvelopeTrackingID> 
      <EnvelopeRevisionNumber>1</EnvelopeRevisionNumber> 
      <SourcePartnerID>UK0000001088</SourcePartnerID> 
      <SourceDivisionID>UK0000001088</SourceDivisionID> 
      <DestinationPartnerID>ang</DestinationPartnerID> 
      <DestinationDivisionID>9725652</DestinationDivisionID> 
      <TestIndicator>True</TestIndicator> 
     </EnvelopeHeader> 
     <!--...... stuff totally irrelevant below--> 
     </Envelope> 
    </payload> 
    <metadata> 
     <metadata-element> 
      <key>messageuniqueid</key> 
      <value>unique-id</value> 
     </metadata-element> 
     <metadata-element> 
      <key>PostCode</key> 
      <value>NR9 5BZ</value> 
     </metadata-element> 
    </metadata> 
</message> 

Затем я запускаю какой-то файл преобразования, который проверяет, если заданное значение элемента, как ожидается, или нет. Мое исходящее сообщение должно выглядеть следующим образом:

<message> 
    <unique-id>unique-id</unique-id> 
    <payload>Some gibberish here</payload> 
    <metadata> 
     <metadata-element> 
      <key>messageuniqueid</key> 
      <value>unique-id</value> 
     </metadata-element> 
     <metadata-element> 
      <key>PostCode</key> 
      <value>NR9 5BZ</value> 
     </metadata-element> 
     <metadata-element> 
      <key>TestResult</key> 
      <value>True/False</value> 
     </metadata-element> 
    </metadata> 
</message> 

Файл XML, который я в настоящее время это:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<axsl:stylesheet xmlns:axsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:exsl="http://exslt.org/common" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="2.0"> 
    <axsl:output method="text"/> 
    <axsl:template match="*|@*" mode="schematron-get-full-path"> 
     <axsl:apply-templates select="parent::*" mode="schematron-get-full-path"/> 
     <axsl:text>/</axsl:text> 
     <axsl:if test="count(. | ../@*) = count(../@*)">@</axsl:if> 
     <axsl:value-of select="name()"/> 
     <axsl:text>[</axsl:text> 
     <axsl:value-of select="1+count(preceding-sibling::*[name()=name(current())])"/> 
     <axsl:text>]</axsl:text> 
    </axsl:template> 
    <axsl:template match="/"> 
     <axsl:apply-templates select="/" mode="M0"/> 
    </axsl:template> 
    <axsl:template match="Envelope/EnvelopeHeader" priority="101" mode="M0"> 
     <axsl:choose> 
     <axsl:when test="EnvelopeTrackingID = 1746978"> 
      <axsl:copy-of select="true()"/> 
     </axsl:when> 
     <axsl:otherwise> 
      <axsl:copy-of select="false()"/> 
     </axsl:otherwise> 
     </axsl:choose> 
     <axsl:apply-templates mode="M0"/> 
    </axsl:template> 
    <axsl:template match="text()" priority="-1" mode="M0"/> 
    <axsl:template match="text()" priority="-1"/> 
</axsl:stylesheet> 

Как вы видите, я установить истину/ложь в зависимости от результата теста, но теперь как добавить это в теги метаданных? как ключевое значение?

Благодаря

+0

Вы имеете в виду, полученный элемент 'value' имеет _either_ истинным или ложным? Кроме того, на простом английском языке: на каком основании (то есть какое условие) вы вставляете true или false? –

+0

@ MathiasMüller Если значение EnvelopeTrackingID равно euqial до 123456 *, тогда я хочу, чтобы значение элемента было равно True. Если идентификатор отслеживания конверта не равен 123456, я хочу, чтобы значение элемента было равно false –

+0

Хорошо. Затем, пожалуйста, не используйте «валидацию», чтобы описать это, потому что это означало бы проверку на схему или DTD. –

ответ

1

я решил написать таблицу стилей с нуля, так как ваш XSLT полна функциональности, которая не имеет отношения к вашему вопросу и просто сбивает с толку. Ваш вопрос заключается в том, как добавить metadata-element к выходу после тестирования для значения, и вот что я иллюстрирую здесь.

Следующая таблица стилей выполняет преобразование идентичности за одним исключением, а именно: добавляет элемент metadata-element. (Кстати, вы можете пересмотреть именование элемента «element»).

Значение нового metadata-element зависит от величины EnvelopeTrackingID.

стилевых

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" indent="yes"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="metadata"> 
    <xsl:copy> 
    <xsl:apply-templates/> 
    <metadata-element> 
     <key>TestResult</key> 
     <value> 
      <xsl:choose> 
       <xsl:when test="preceding-sibling::payload/Envelope/EnvelopeHeader/EnvelopeTrackingID = '1746978'"> 
       <xsl:text>true</xsl:text> 
       </xsl:when> 
       <xsl:otherwise> 
       <xsl:text>false</xsl:text> 
       </xsl:otherwise> 
      </xsl:choose> 
     </value> 
    </metadata-element> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Выход

<?xml version="1.0" encoding="UTF-8"?> 
<message> 
<unique-id>unique-id</unique-id> 
<payload> 
    <Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="http://mappings.f4f.com/F4FXML/Schemas/v5/financial.xsd"> 
    <EnvelopeHeader> 
     <SchemaVersion>5.1</SchemaVersion> 
     <EnvelopeCreated>20140108</EnvelopeCreated> 
     <EnvelopeTrackingID>1746978</EnvelopeTrackingID> 
     <EnvelopeRevisionNumber>1</EnvelopeRevisionNumber> 
     <SourcePartnerID>UK0000001088</SourcePartnerID> 
     <SourceDivisionID>UK0000001088</SourceDivisionID> 
     <DestinationPartnerID>ang</DestinationPartnerID> 
     <DestinationDivisionID>9725652</DestinationDivisionID> 
     <TestIndicator>True</TestIndicator> 
    </EnvelopeHeader> 
    <!--...... stuff totally irrelevant below--> 
    </Envelope> 
</payload> 
<metadata> 
    <metadata-element> 
     <key>messageuniqueid</key> 
     <value>unique-id</value> 
    </metadata-element> 
    <metadata-element> 
     <key>PostCode</key> 
     <value>NR9 5BZ</value> 
    </metadata-element> 
    <metadata-element> 
    <key>TestResult</key> 
    <value>true</value> 
    </metadata-element> 
</metadata> 
</message> 
+0

Этот шаблон работал бы, если бы я запускал его сам по себе, однако мне нужно держать текущий xsl со всеми функциями. Я попытался адаптировать то, что вы написали, к моему текущему шаблону, но никакого результата. –

+0

Невозможно узнать, как ваш код XSLT реагирует на то, что код подключен к _somewhere_, особенно, поскольку он кажется настолько сложным и запутанным. Но почему бы вам не взглянуть на свой код и не подумать о себе? Есть проблемы, которые не решены в течение 5 минут. –

+1

В любом случае я дам вам подсказку: Чтобы вставить «элемент метаданных» в нужную позицию, вы должны сопоставлять «метаданные» (или иначе располагаться в позиции «метаданных» в дереве). Я подозреваю, что вы пытались вставить мой код в тот момент, когда вы соглашаетесь на 'Envelope/EnvelopeHeader'. –

Смежные вопросы