2014-03-27 32 views
0

所以,我得到了這個XSL,我需要拷貝患者姓名的「部分」。我想複製的唯一部分是'姓'和'名字'。如果存在中間名或中間名,則該部分需要被忽略。這些名字總是被插入符號'^'分開,所以這可能是一種簡單的方法來忽略中間名或初始名,如果它們存在&它們並不總是出現。一些患者只會以'姓氏'&'名字'過來。XSL僅拷貝字符串的'部分'

編輯:

如果病人只能用「姓」 &「名」過來,然後它看起來像「李四^約翰」,這是我想什麼複製,所以將沒有第二個插入符號。

這JBOSS 4.x的運行與XALAN

這是我的樣式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" indent="no"/> 
<xsl:template match="/dataset"> 
<dataset> 
<!-- Specific Character Set --> 
<xsl:copy-of select="attr[@tag='00080005']"/> 
<!-- Admitting Diagnoses Description --> 
<attr tag="00081080" vr="LO"/> 
<!-- Referring Physican Name --> 
<attr tag="00080090" vr="PN"/> 
<!-- Patient Name --> 
<xsl:copy-of select="attr[@tag='00100010']"/> 
<!-- Patient Birthdate --> 
<xsl:copy-of select="attr[@tag='00100030']"/> 
<!--Patient ID --> 
<attr tag="00100020" vr="LO"/> 
</dataset> 
</xsl:template> 
</xsl:stylesheet> 

在上面的代碼,我只是想患者的複製「部分」 '姓名和出生日期。現在,它複製了患者姓名的全部價值。

這是輸入,它會得到的信息:

<?xml version="1.0" encoding="UTF-8"?> 
<dataset> 
<attr tag="00080008" vr="CS" pos="0" name="Image Type" vm="2" len="18">ORIGINAL\SECONDARY</attr> 
<attr tag="00080016" vr="UI" pos="26" name="SOP Class UID" vm="1" len="26">1.2.840.10008.5.1.4.1.1.7</attr> 
<attr tag="00080018" vr="UI" pos="60" name="SOP Instance UID" vm="1" len="56">1.3.6.1.4.1.23849.372900571.11.1635314520851301288.2.2.1</attr> 
<attr tag="00080020" vr="DA" pos="124" name="Study Date" vm="1" len="8">20140326</attr> 
<attr tag="00080022" vr="DA" pos="140" name="Acquisition Date" vm="1" len="8">20140326</attr> 
<attr tag="00080030" vr="TM" pos="156" name="Study Time" vm="1" len="6">173426</attr> 
<attr tag="00080032" vr="TM" pos="170" name="Acquisition Time" vm="1" len="6">173426</attr> 
<attr tag="00080050" vr="SH" pos="-1" name="Accession Number" vm="1" len="3">OUT</attr> 
<attr tag="00080054" vr="AE" pos="-1" name="Retrieve AE Title" vm="1" len="8">RADARCH2</attr> 
<attr tag="00080060" vr="CS" pos="202" name="Modality" vm="1" len="2">CT</attr> 
<attr tag="00080061" vr="CS" pos="212" name="Modalities in Study" vm="1" len="2">CT</attr> 
<attr tag="00080064" vr="CS" pos="222" name="Conversion Type" vm="1" len="4">WSD</attr> 
<attr tag="00080070" vr="LO" pos="234" name="Manufacturer" vm="0" len="0"/> 
<attr tag="00080080" vr="LO" pos="242" name="Institution Name" vm="0" len="0"/> 
<attr tag="00080090" vr="PN" pos="250" name="Referring Physician's Name" vm="1" len="20">DOC^TEST^TESTES</attr> 
<attr tag="00081010" vr="SH" pos="278" name="Station Name" vm="0" len="0"/> 
<attr tag="00081030" vr="LO" pos="286" name="Study Description" vm="1" len="20">CT HEAD W/O CONTRAST</attr> 
<attr tag="0008103E" vr="LO" pos="314" name="Series Description" vm="0" len="0"/> 
<attr tag="00081040" vr="LO" pos="322" name="Institutional Department Name" vm="0" len="0"/> 
<attr tag="00081070" vr="PN" pos="330" name="Operator's Name" vm="0" len="0"/> 
<attr tag="00081090" vr="LO" pos="338" name="Manufacturer's Model Name" vm="0" len="0"/> 
<attr tag="00100010" vr="PN" pos="346" name="Patient's Name" vm="1" len="16">DOE^JOHN^BOY</attr> 
<attr tag="00100020" vr="LO" pos="370" name="Patient ID" vm="1" len="8">123456</attr> 
<attr tag="00100021" vr="LO" pos="-1" name="Issuer of Patient ID" vm="1" len="4">HOSP</attr> 
<attr tag="00100030" vr="DA" pos="394" name="Patient's Birth Date" vm="1" len="8">19010101</attr> 
<attr tag="00100040" vr="CS" pos="410" name="Patient's Sex" vm="1" len="2">M</attr> 
</dataset> 

從上面的輸入時,患者的名字是‘美國能源部^約翰^ BOY’,我想複製的選擇語句只複製'DOE^JOHN'。我將如何去做這件事?我會以某種方式使用'substring-before'函數嗎?

感謝

編輯#2

只要想到我會張貼代碼我現在有如預期那樣工作。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" indent="no"/> 
<xsl:template match="/dataset"> 
<dataset> 
<xsl:variable name="modPatName" select="attr[@tag='00100010']"/> 
<xsl:variable name="before-first" select="substring-before($modPatName, '^')"/> 
<xsl:variable name="after-first" select="substring-after($modPatName, '^')"/> 
<!-- Specific Character Set --> 
<xsl:copy-of select="attr[@tag='00080005']"/> 
<!-- Admitting Diagnoses Description --> 
<attr tag="00081080" vr="LO"/> 
<!-- Referring Physican Name --> 
<attr tag="00080090" vr="PN"/> 
<xsl:choose> 
    <xsl:when test="contains($after-first, '^')"> 
     <attr tag="00100010" vr="PN"> 
      <xsl:value-of select="concat($before-first, '^', substring-before($after-first, '^'))"/> 
     </attr> 
    </xsl:when> 
    <xsl:otherwise> 
      <attr tag="00100010" vr="PN"> 
       <xsl:value-of select="$modPatName"/> 
      </attr> 
    </xsl:otherwise> 
</xsl:choose> 
<!--<xsl:copy-of select="attr[@tag='00100010']"/> --> 
<xsl:copy-of select="attr[@tag='00100030']"/> 
<!--Patient ID --> 
<attr tag="00100020" vr="LO"/> 
</dataset> 
</xsl:template> 
</xsl:stylesheet> 
+0

是的,你會使用'substring-before'函數。你有什麼嘗試?這實際上只是關於XPath,而不是XSLT。 – harpo

+0

@harpo thx,我在這篇文章中編輯了標籤。我不確定如何告訴substring-before只查看第二個插入符號之前的內容,如果在某些情況下確實存在,則放棄第二個插入符號。現在我想到了,它可能不會複製第二個插入符號。 :) – Docjay

回答

0

嗯,我說這只是XPath,但你可能想使用一些XSLT。在子字符串出現之前,沒有單個函數調用來獲取子字符串。

我減少了輸入簡單性:

<names> 
    <name>WILKES^JOHN^BOOTH</name> 
    <name>MADONNA</name> 
    <name>DOE^JOHN^BOY</name> 
    <name>ELON^MUSK</name> 
</names> 

用下面的變換,

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes" /> 

    <xsl:template match="/names"> 
     <xsl:for-each select="name"> 
      <xsl:variable name="before-first" select="substring-before(., '^')"/> 
      <xsl:variable name="after-first" select="substring-after(., '^')"/> 

      <name> 
       <xsl:choose> 

        <xsl:when test="contains($after-first, '^')"> 
         <xsl:value-of select="concat($before-first, '^', substring-before($after-first, '^'))"/> 
        </xsl:when> 

        <xsl:otherwise> 
         <xsl:value-of select="."/> 
        </xsl:otherwise> 

       </xsl:choose> 
      </name> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:transform> 

你得到

<name>WILKES^JOHN</name> 
<name>MADONNA</name> 
<name>DOE^JOHN</name> 
<name>ELON^MUSK</name> 

我認爲這是你想要的。

pure-XPath做內聯分支的方法(「Oliver Becker」),即沒有choose。但它比上面更醜。

+0

感謝哈波看着這個。 :)明天我會嘗試第一件事。 – Docjay

+0

請注意,由於您使用的是Java語言,所以沒有任何東西可以阻止您轉向使用XSLT 2.0,這會使其成爲單行語句:'string-join(subsequence(tokenize(。,'\ ^'),1,2) ,'^')' –

+0

這對於漂亮的XSLT 2.0來說真是太好了,但我無法弄清楚如何使JBAX 4.xx中的JAVAX調用SAXON變換器知識不足。我只能希望我們系統的下一個版本使用升級到JBOSS 7. – Docjay