2016-06-07 94 views
0

我有這樣的XSLT刪除時間戳&轉換屬性轉換成元素:XSLT從所有元素中刪除時間戳,除了一個

<xsl:stylesheet version="1.0" xmlns="namespace" 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="*[@*]"> 
<xsl:choose> 
<xsl:when test="text() and @*"> 
<xsl:copy> 
<xsl:element name="{local-name()}"> 
<xsl:apply-templates select="node()"/> 
</xsl:element> 
<xsl:apply-templates select="@*"/> 
</xsl:copy> 
</xsl:when> 
<xsl:when test="node()|@*"> 
<xsl:copy> 
<xsl:apply-templates select="node()|@*"/> 
</xsl:copy> 
</xsl:when> 
</xsl:choose> 
</xsl:template> 

<xsl:template match="@*"> 
<xsl:element name="{name()}"> 
<xsl:value-of select="."/> 
</xsl:element> 
</xsl:template> 

<xsl:template match="//*[contains(name(), 'Date') and not(ancestor-or-self::EventDate)]"> 
<xsl:element name="{local-name()}"> 
<xsl:value-of select="substring(.,1,10)"/> 
</xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

&我的源XML看起來是這樣的:

<?xml version="1.0" encoding="ISO-8859-1" standalone='yes'?> 
<CaseEvent xmlns="namespace"> 
<TransactionInfo> 
<EventDate>2016-06-02T02:07:30.000-04:00</EventDate> 
<CaseID>872519</CaseID> 
</TransactionInfo> 
<NewCaseEvent> 
<Case changeType="I">   
    <Plan changeType="I"> 
    <Provision> 
      <ProvisionTextValue>70</ProvisionTextValue> 
      <EffectiveDate>2016-01-01-05:00</EffectiveDate> 
     </Provision> 
    </Plan>  
    <BillGroup changeType="I"> 
     <BillGroupIdentifierDate>2016-01-01-05:00</BillGroupIdentifierDate> 
     </BillGroup>  
    </Case> 
    </NewCaseEvent> 
</CaseEvent> 

我想從以外的所有日期元素中移除時間戳事件日期

預期輸出:

<CaseEvent xmlns="namespace"> 
<TransactionInfo> 
    <EventDate>2016-06-02T02:07:30.000-04:00</EventDate> 
    <CaseID>872519</CaseID> 
</TransactionInfo> 
<NewCaseEvent> 
    <Case changeType="I"> 
     <Plan changeType="I"> 
      <Provision> 
       <ProvisionTextValue>70</ProvisionTextValue> 
       <EffectiveDate>2016-01-01</EffectiveDate> 
      </Provision> 
     </Plan> 
     <BillGroup changeType="I"> 
      <BillGroupIdentifierDate>2016-01-01</BillGroupIdentifierDate> 
     </BillGroup> 
    </Case> 
</NewCaseEvent> 
</CaseEvent> 

如果我從源XML命名空間中刪除,這XSL工作正常,但如果命名空間被添加則沒有產生預期的結果。 感謝這方面的幫助!

回答

1

不能使用的命名空間中的XSL沒有前綴,使用xmlns:my="namespace"然後你前綴的元素名稱的所有引用與my: - 雖然我看不出有什麼,但你也必須改變所有name() S IN您的XPath來local-name()

編輯

爲了保持時間戳在EVENTDATE,更換

and not(ancestor-or-self::(my:)EventDate) 

and local-name() != 'EventDate' 
+0

嗨Stefan,感謝您的回覆,但我沒有在我的xml中使用前綴。我試着根據你的建議改變XSLT中的命名空間聲明&** name()**,但是我沒有看到輸出的任何改變。 –

+0

我看到了,請檢查我的編輯請 –

+0

它的工作完美。非常感謝 ! –