Нужна помощь Преобразование измерений с шаблоном XSLT - PullRequest
0 голосов
/ 18 апреля 2020

Итак, я уже пытался взять эти данные и превратить их в шаблон для преобразования см в дюймы, он также должен быть округлен. Я должен сделать это через шаблон, это не может быть сделано в основном xslt (template = '/' это должен быть именованный шаблон). Это для класса. Вот небольшой фрагмент данных:

<org.openmrs.module.webservices.rest.SimpleObject
                                serialization="custom">
                                <unserializable-parents/>
                                <map>
                                    <default>
                                        <loadFactor>0.75</loadFactor>
                                        <threshold>12</threshold>
                                    </default>
                                    <int>16</int>
                                    <int>3</int>
                                    <string>uuid</string>
                                    <string>81f182fa-51d0-4790-87c2-912b3e011221</string>
                                    <string>display</string>
                                    <string>Height (cm): 156.0</string>
                                    <string>links</string>
                                    <list>
                                        <org.openmrs.module.webservices.rest.web.Hyperlink>
                                            <rel>self</rel>
                                            <uri>http://b581.site/openmrs/ws/rest/v1/obs/81f182fa-51d0-4790-87c2-912b3e011221</uri>
                                        </org.openmrs.module.webservices.rest.web.Hyperlink>
                                    </list>
                                </map>

Вот то, что я пробовал до сих пор:

>  <xsl:call-template name="Bologna">
                        <xsl:with-param name= 'rounded' select='substring(./string[4],12,5)'/>
                    </xsl:call-template>

Я, вероятно, потерплю неудачу, если не получу это. У меня был ужасный учитель, который не хочет учить; если вы знаете какие-либо ресурсы, чтобы помочь мне, я был бы очень признателен.

 <xsl:template match="/">
    <data>
        <extractor>
            <name>Greg API Bushyeager</name>
        </extractor>
        <query> <method>GET</method>
            <url>
                <address>https://b581.site/openmrs/ws/rest/v1/</address>
                <queryParameters>
                    <parameter key="v" value="full"/>
                    <parameter key="limit" value="500"/>
                    <parameter key="q" value="API"/>
                </queryParameters> </url>
            <headers type="nonHidden">
                <header key="accept" value="application/xml"/>
            </headers>
        </query>
        <xsl:for-each select="//string[(text() = '5090AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')]/../../..">
            <obs uuid="5090AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA">
                <person>
                    <xsl:value-of
                        select='./org.openmrs.module.webservices.rest.SimpleObject[2]/map/string[4]'/>
                </person>
                <originaldatetime>
                    <xsl:value-of  select="./string[8]"/>
                </originaldatetime>

                <height>
                    <xsl:call-template name="cm-to-inch"/>
                    <Units>In</Units>
                </height>
            </obs>
        </xsl:for-each>
    </data>
</xsl:template>

Как я могу назвать предоставленный вами шаблон, в этот шаблон с отображением только измерения. xxin

Id c если есть единицы, я всегда могу их добавить.

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Если бы мне пришлось угадывать природу вашего задания, я бы подумал, что цель состоит в том, чтобы создать общий шаблон c, который преобразует измерения в сантиметрах в дюймы. Нечто похожее на функцию, которая может быть вызвана из любого контекста и не имеет собственного контекста:

<xsl:template name="cm-to-inch">
    <xsl:param name="cm">
    <xsl:value-of select="$cm div 2.54"/>
</xsl:template>

, который вы затем вызываете из другого шаблона со значением узла в качестве параметра. Например:

XML

<object>
    <name>box</name>
    <length unit="cm">48</length>
    <width unit="cm">20</width>
    <height unit="cm">36</height>
    <weight unit="kg">1.5</weight>
</object>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*[@unit='cm']">
    <xsl:copy>  
        <xsl:attribute name="unit">in</xsl:attribute>
        <xsl:call-template name="cm-to-inch">
            <xsl:with-param name="cm" select="."/>
        </xsl:call-template>
    </xsl:copy>
</xsl:template>

<xsl:template name="cm-to-inch">
    <xsl:param name="cm"/>
    <xsl:value-of select="$cm div 2.54"/>
</xsl:template>

</xsl:stylesheet>

Результат

<?xml version="1.0" encoding="UTF-8"?>
<object>
  <name>box</name>
  <length unit="in">18.8976377952756</length>
  <width unit="in">7.874015748031496</width>
  <height unit="in">14.1732283464567</height>
  <weight unit="kg">1.5</weight>
</object>

оно также должно быть округлено.

Ну, это зависит от того, какую точность вы хотите, чтобы оно было округлено к. Функция round() в XSLT округляет до ближайшего целого числа . Если вы хотите большей точности, скажем, 2 десятичных знака, вам нужно сделать что-то вроде:

<xsl:value-of select="round(100 * $cm div 2.54) div 100"/>

В качестве альтернативы вы можете сделать:

<xsl:value-of select="format-number($cm div 2.54, '#.00')"/>

, но это не то же самое, потому что :

  1. В результате получается строка , которая может содержать конечный ноль / с;
  2. В зависимости от процессора правила округления могут отличаться.
0 голосов
/ 18 апреля 2020

Вам нужно исправить образец XML:

<map>
<default>
<loadFactor>0.75</loadFactor>
<threshold>12</threshold>
</default>
<int>16</int>
<int>3</int>
<string>uuid</string>
<string>81f182fa-51d0-4790-87c2-912b3e011221</string>
<string>display</string>
<string>Height (cm): 156.0</string>
<string>links</string>
<list>
<org.openmrs.module.webservices.rest.web.Hyperlink>
<rel>self</rel>
<uri>http://b581.site/openmrs/ws/rest/v1/obs/81f182fa-51d0-4790-87c2-912b3e011221</uri>
</org.openmrs.module.webservices.rest.web.Hyperlink>
</list>
</map>

Мы можем использовать что-то вроде:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>


<xsl:template match="string[contains(.,'Height')]">
    <xsl:copy>
      <xsl:value-of select="concat('Height (in): ',round(10 * substring-after(.,': ') div 2.54) div 10)"/>
    </xsl:copy>
  </xsl:template>


</xsl:stylesheet>

РЕДАКТИРОВАТЬ: ".0 удалено", "//" удалено .

Вывод: Высота (дюйм): 61,4 | Тест: http://xsltransform.net/eiouzmi/6

W3Schools - хорошее место для начала.

РЕДАКТИРОВАТЬ 2: Другое выражение XPath 1.0 для округления преобразованного значения (безобразно):

concat(floor(substring-after(//string[contains(.,'Height')],': ') div 2.54),'.',substring(substring(substring-after(substring-after(//string[contains(.,'Height')],': ') div 2.54,'.'),1,1)+translate(substring(substring-after(substring-after(//string[contains(.,'Height')],': ') div 2.54,'.'),2,1),'123456789','000001111'),string-length(substring(substring-after(substring-after(//string[contains(.,'Height')],': ') div 2.54,'.'),1,1)+translate(substring(substring-after(substring-after(//string[contains(.,'Height')],': ') div 2.54,'.'),2,1),'123456789','000001111')),1))

Выход: 61,4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...