XSL只复制字符串的“部分”

时间:2014-03-27 04:32:29

标签: xml xpath copy

所以,我有这个XSL,我需要只复制患者姓名的“部分”。我要复制的唯一部分是“姓氏”和“名字”。如果存在中间名称或中间名称,则需要忽略该部分。名称总是由插入符号'^'分隔,因此这可能是忽略中间名称或首字母的简单方法,如果它们存在&它们并不总是出现。有些病人只会来一个“姓氏”和'名字'。

修改

如果患者仅使用“姓氏”和“名字”然后它看起来像'Doe ^ John',这是我想要复制的,所以没有第二个插入符号。

这是在使用XALAN的JBOSS 4.x中运行

这是我的样式表:

<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>

从上面的输入中,患者的名字是'DOE ^ JOHN ^ BOY',我希望select语句的副本只能复制'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>

1 个答案:

答案 0 :(得分:0)

好吧,我说这只是关于XPath,但你可能想要使用一些XSLT。在子串的第N 次出现之前,没有单个函数调用来获取子字符串。

我将输入简化为:

<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。但它甚至比上面更丑陋。