2014-01-09 33 views
-1

我已經創建了一個簡單的XSL文件,該文件對XML文件執行轉換。現在,如果傳遞= true,fail = false,則轉換返回True或False(取決於測試的結果)。現在我想添加額外的標記到我的XML與這個值 我已經看到this後,並試圖將其適應我的問題,但它沒有工作。如何通過XSL向XML添加元素

我的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_真的還是假的?另外,用簡單的英語:你在什麼基礎上(即什麼條件)插入真或假? –

+0

@MathiasMüller如果EnvelopeTrackingID等於123456 *,那麼我希望元素值等於True。如果信封跟蹤ID不等於123456我希望元素值等於假 –

+0

好的。然後,請不要使用「驗證」來描述這一點,因爲這意味着檢查模式或DTD。 –

回答

1

我決定從頭開始編寫一個樣式表,因爲你的XSLT是滿的功能,無關你的問題,只是混亂。你的問題是如何在測試一個值之後向輸出添加一個metadata-element,這就是我在這裏說明的。

以下樣式表執行一個例外的標識轉換,即添加metadata-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'的地方插入我的代碼。 –