2013-05-16 69 views
1

我想知道如何用縮寫替換字符串。XSLT:用縮寫替換字符串

我的XML看起來像下面

  <concept reltype="CONTAINS" name="Left Ventricular Major Axis Diastolic Dimension, 4-chamber view" type="NUM"> 
      <code meaning="Left Ventricular Major Axis Diastolic Dimension, 4-chamber view" value="18074-5" schema="LN" /> 
      <measurement value="5.7585187646"> 
       <code value="cm" schema="UCUM" /> 
      </measurement> 
      <content> 
       <concept reltype="HAS ACQ CONTEXT" name="Image Mode" type="CODE"> 
       <code meaning="Image Mode" value="G-0373" schema="SRT" /> 
       <code meaning="2D mode" value="G-03A2" schema="SRT" /> 
       </concept> 
      </content> 
      </concept> 

,我從XML如選擇一些價值,

<xsl:value-of select="concept/measurement/code/@value"/> 

現在我想的是,我有釐米,以取代釐米。我有這麼多的話。我想有一個縮寫的XML和替換他們。

我在這裏看到一個類似的例子。

Using a Map in XSL for expanding abbreviations

但它取代節點的文字,但我有文本的屬性。另外,它對我來說更好如果我使用xsl:valueof select選擇文本而不是使用單獨的xsl:模板,則可以查找和替換。請幫忙。我是xslt的新手。

+1

要使用「1.0」或「2.0」的XSLT版本是什麼? –

+0

縮寫列表應該放在哪裏?第二個xml文件。同樣的xml文件作爲輸入,或xslt文件?如果你使用的是xslt-1.0,你可以使用擴展節點集? –

+0

+1 Nice Question – NullPointer

回答

2

我已經創建了XSLT v「1.1」。有關縮寫詞我已經創建XML文件作爲你提到:

Abbreviation.xml:

<Abbreviations> 
    <Abbreviation> 
    <Short>cm</Short> 
    <Full>centimeter</Full> 
    </Abbreviation> 
    <Abbreviation> 
    <Short>m</Short> 
    <Full>meter</Full> 
    </Abbreviation> 
</Abbreviations> 

XSLT:

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

    <xsl:output indent="yes" method="xml" /> 
    <xsl:param name="AbbreviationDoc" select="document('Abbreviation.xml')"/> 

    <xsl:template match="/"> 
    <xsl:call-template name="Convert"> 
     <xsl:with-param name="present" select="concept/measurement/code/@value"/> 
    </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="Convert"> 
    <xsl:param name="present"/> 
    <xsl:choose> 
     <xsl:when test="$AbbreviationDoc/Abbreviations/Abbreviation[Short = $present]"> 
     <xsl:value-of select="$AbbreviationDoc/Abbreviations/Abbreviation[Short = $present]/Full"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$present"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

輸入:

你已給出<xsl:value-of select="concept/measurement/code/@value"/>

OUTPUT:

centimeter 

你只需要加強這方面的Abbreviation.xml保持縮寫的短期和全部價值,並呼籲「轉換」模板,通過電流值,從而獲得所需的輸出。

+0

對我很好看。如果我是對的,這也應該用xlst-1.0運行。 (我不明白爲什麼要使用parm變量也應該這樣做) –

+0

有兩種方法來運行此腳本。首先,如果你使用的是Saxon6.5.5。保持xslt版本「1.1」。其次,如果你想保持XSLT版本「1.0」,那麼你必須實現XSLT擴展功能。關於param,我們有兩個定義的參數'AbbreviationDoc'(保留縮寫。xml文件)和'present'將您的XML值傳遞給我們的模板'Convert'。 –

+0

是的。它工作正常。謝謝你這麼多navin .... –

1

這裏短一點的版本:
- 在XSLT文件
縮寫 - 利用與模式的應用模板,使使用更短。

但是使用xslt 1.0節點集擴展是必需的。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common" 
    extension-element-prefixes="exsl"> 

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

    <xsl:variable name="abbreviations_txt"> 
     <abbreviation abbrev="cm" >centimeter</abbreviation> 
     <abbreviation abbrev="m" >meter</abbreviation> 
    </xsl:variable> 

    <xsl:variable name="abbreviations" select="exsl:node-set($abbreviations_txt)" /> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="concept/measurement/code/@value" mode="abbrev_to_text"/> 
    </xsl:template> 

    <xsl:template match="* | @*" mode="abbrev_to_text"> 
     <xsl:variable name="abbrev" select="." /> 
     <xsl:variable name="long_text" select="$abbreviations//abbreviation[@abbrev = $abbrev]/text()" /> 
     <xsl:value-of select="$long_text"/> 
     <xsl:if test="not ($long_text)"> 
      <xsl:value-of select="$abbrev"/> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 
+0

這就是我做hr_117的過程。謝謝。 –