【问题标题】:How to extract the 'LOC_NAME_CHART_NUM_ENG' element value into <td>如何将“LOC_NAME_CHART_NUM_ENG”元素值提取到 <td>
【发布时间】:2021-02-12 11:53:28
【问题描述】:

在以下示例中,我们在 xslt 中硬编码了“LOC_NAME_CHART_NUM_ENG”元素,并尝试使用 xslt 1.0 实现自动化:

案例1:如果'<NOBJNM>'之前没有文字(即,在这种情况下,在 '<NOBJNM>' 之后可能是 .. 等元素,我们也需要保留这些元素)。 <NOBJNM>凯库拉南防波堤
应该是
凯库拉南防波堤

情况 2: 如果文本之前有 '<NOBJNM>'
凯库拉南防波堤头
应该是
凯库拉南防波堤头

输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<NM_LIGHT_LIST_RECORD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<PRODUCT_REF>
    <PRODUCTVER_ID>572902</PRODUCTVER_ID>
    <UPDATE_KEY>4277</UPDATE_KEY>
    <CONTRIBUTING_FEATURE_LIST>
        <CONTRIBUTING_FEATURE_VERSION_ID>57509415</CONTRIBUTING_FEATURE_VERSION_ID>
        <CONTRIBUTING_FEATURE_VERSION_ID>57508780</CONTRIBUTING_FEATURE_VERSION_ID>
    </CONTRIBUTING_FEATURE_LIST>
</PRODUCT_REF>
<NATIONAL_NUMBER xsi:nil="true"/>
<INTERNATIONAL_NUMBER>4277</INTERNATIONAL_NUMBER>
<!--<LOC_NAME_CHART_NUM_ENG>&lt;NOBJNM&gt;Kaikoura South Breakwater Head</LOC_NAME_CHART_NUM_ENG>-->
<LOC_NAME_CHART_NUM_ENG>Kaikōura South Breakwater Head&lt;NOBJNM&gt;Kaikoura South Breakwater Head</LOC_NAME_CHART_NUM_ENG>
<POSITION>
    <LATITUDE>42 25.56</LATITUDE>
    <LONGITUDE>173 40.85</LONGITUDE>
</POSITION>
<LIGHT_CHARACTERISTICS_ENG>Iso  G 2s</LIGHT_CHARACTERISTICS_ENG>
<LUM_GEO_RANGE>6</LUM_GEO_RANGE>
<LIGHT_HEIGHT>6</LIGHT_HEIGHT>
<DESC_STRUCT_HEIGHT_ENG> Black and white Horizontal stripes,  metal pole<p style="text-align:center;margin-top: 0px;margin-bottom: 2px;">3</p></DESC_STRUCT_HEIGHT_ENG>
<OBSERVATION_ENG>
    <br/>
</OBSERVATION_ENG>
<NM_LIGHTS_OBMNZ>No</NM_LIGHTS_OBMNZ>
</NM_LIGHT_LIST_RECORD>

预期输出:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<table xmlns:gml="http://www.opengis.net/gml/3.2" style="width:100%;font-size:8pt;">
    <tr style="vertical-align:text-top;">
        <td style="width:10%;font-weight:bold;">4277</td>
        <td style="width:20%;">Kaikōura South Breakwater Head</td>
        <td style="width:14%;text-align:right;">42 25.56<br>173 40.85</td>
        <td style="width:14%;padding-left:15px;">Iso  G 2s</td>
        <td style="width:5%;">6</td>
        <td style="width:5%;">6</td>
        <td style="width:20%;"> Black and white Horizontal stripes,  metal pole
            <p xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" style="text-align:center;margin-top: 0px;margin-bottom: 2px;">3</p>
        </td>
        <td style="width:20%;">
            <OBSERVATION_ENG xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <br>
            </OBSERVATION_ENG>
        </td>
    </tr>
</table>

XSLT 代码:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">

<xsl:output method="html" encoding="UTF-8" indent="yes"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/>

<xsl:template match="/NM_LIGHT_LIST_RECORD">
    <table style="width:100%;font-size:8pt;">
        <tr style="vertical-align:text-top;">
            <td style="width:10%;font-weight:bold;"><xsl:value-of select="INTERNATIONAL_NUMBER"/></td>
            <td style="width:20%;">
                <!--<xsl:copy-of select="LOC_NAME_CHART_NUM_ENG/node()"/>-->
                <xsl:variable name="NOBJNM">
                    <xsl:copy-of select="LOC_NAME_CHART_NUM_ENG/node()"/>
                </xsl:variable>
                <xsl:choose>
                    <xsl:when test="$NOBJNM = 'Kaikōura South Breakwater Head&lt;NOBJNM&gt;Kaikoura South Breakwater Head'">
                        <xsl:value-of select="'Kaikōura South Breakwater'"/>
                    </xsl:when>
                    <xsl:when test="$NOBJNM = 'Māpua Port Pile&lt;NOBJNM&gt;Mapua Port Pile'">
                        <xsl:value-of select="'Māpua Port Pile'"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:copy-of select="$NOBJNM"/>
                    </xsl:otherwise>
                </xsl:choose>
            </td>
            <td style="width:14%;text-align:right;">
                <xsl:value-of select="translate(POSITION/LATITUDE,'NEWS','')"/>
                <br/>
                <xsl:value-of select="translate(POSITION/LONGITUDE,'NEWS','')"/>
            </td>
            <td style="width:14%;padding-left:15px;"><xsl:value-of select="LIGHT_CHARACTERISTICS_ENG"/></td>
            <td style="width:5%;"><xsl:value-of select="LIGHT_HEIGHT"/></td>
            <td style="width:5%;"><xsl:copy-of select="LUM_GEO_RANGE/node()"/></td>
            <td style="width:20%;"><xsl:copy-of select="DESC_STRUCT_HEIGHT_ENG/node()"/>
                <xsl:variable name="height" select="STRUCT_HEIGHT"/>
                <xsl:if test="$height != ''"><p style="text-align:center;margin-top: 0px;margin-bottom: 2px;"><xsl:value-of select="$height"/></p></xsl:if>
            </td>
            <td style="width:20%;">
                <xsl:copy-of select="OBSERVATION_ENG"></xsl:copy-of>
                <xsl:choose>
                    <xsl:when test="NM_LIGHTS_STATUS='Temporary'">
                        <br/><strong> T </strong>
                    </xsl:when>
                    <xsl:when test="NM_LIGHTS_STATUS='Racon temporarily discontinued'">
                        <br/><strong> TR </strong>
                    </xsl:when>
                    <xsl:when test="NM_LIGHTS_STATUS='Preliminary'">
                        <br/><strong> P </strong>
                    </xsl:when>
                    <xsl:when test="NM_LIGHTS_STATUS='Temporarily discontinued (non-light AtoN)'">
                        <br/><strong> TD </strong>
                    </xsl:when>
                    <xsl:when test="NM_LIGHTS_STATUS='Temporarily extinguished (light AtoN)'">
                        <br/><strong> TE </strong>
                    </xsl:when>
                    <xsl:otherwise/>
                </xsl:choose>
                <xsl:if test="NM_LIGHTS_STATUS != ''">
                    <strong><xsl:value-of select="../../../NM_YEAR_PUB"/></strong>  
                </xsl:if>
            </td>
        </tr>
    </table>
</xsl:template>
</xsl:stylesheet>

参考网址# http://xsltransform.net/94hvTAf/663

【问题讨论】:

    标签: xml xslt xpath xslt-1.0 xquery


    【解决方案1】:

    尽管这可以使用单个 XPath 表达式来完成,但我将遵循您的 XSLT 风格:

    <xsl:variable 
        name="NOBJNM" 
        select="substring-before(LOC_NAME_CHART_NUM_ENG, '&lt;NOBJNM&gt;')"/>
    <xsl:choose>
        <xsl:when test="$NOBJNM">
            <xsl:value-of select="$NOBJNM"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of 
                select="substring-after(LOC_NAME_CHART_NUM_ENG, '&lt;NOBJNM&gt;')"/>
        </xsl:otherwise>
    </xsl:choose>
    

    【讨论】:

    • @Alejando - 如果我们在这种情况下使用 元素会像 , ...等
    • 从您的样本中不清楚。在带有'&amp;lt;NOBJNM&amp;gt;' 字符串的文本节点之前或之后可能有元素吗?请提供完整的示例。
    • @Alejando - 我们可以在现有示例中尝试在 '<NOBJNM> 之后添加 xyz 元素。并避免在 '<NOBJNM>. 之前
    • 我没有麻烦地修改答案,但是&amp;lt;NOBJNM&amp;gt; 的使用让我认为将解析的数据编码为未解析的数据。这会引起一些警报。这也是为什么您的示例应该反映“标记”是 LOC_NAME_CHART_NUM_ENG 元素的文本节点子节点而不是后代(即在其他一些元素内,为破坏标准创造必要性)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2015-02-23
    • 1970-01-01
    相关资源
    最近更新 更多