gpt4 book ai didi

xml - 如何将纯文本转换为 xsl

转载 作者:行者123 更新时间:2023-12-04 06:12:06 25 4
gpt4 key购买 nike

我尝试了不同的方式来处理这些信息到 xml,没有任何效果。

请帮忙

我在一个标签中有多行。我必须将它们转换为正确的 xml 文档。

这是文本/字符串

  <params>
userdata_token=>'abd'
userdata_time=>'12/09/2011'
user_message_address_city=>'Manchester|Harrow|'
user_message_address_postcode=>'M20 7LD||HA0 4BN'
user_message_address_addressee=>'|Pete|'
</params>

像xml格式
  <params>
<userdata>
<token>abd</temp>
<time>12/09/2011</time>
</userdata>
<user>
<message>
<address>
<city>Manchester</city>
<postcode>M20 7LD</postcode>
<addressee></addressee>
</address>
<address>
<city>Harrow</city>
<postcode></postcode>
<addressee>Pete</addressee>
</address>
<address>
<city></city>
<postcode>HA0 4BN</postcode>
<addressee></addressee>
</address>
</message>
<user>
</params>

请有人帮助将字符串拆分为分层元素和相应的值,我希望在 XSL 和 Java 中执行此操作,输出格式正确的 xml。我没有输出的 xsd,所以我不能使用绑定(bind)模式。

最佳答案

这实际上在 XSLT 2.0 中非常方便.

出于快速演示的目的(没有完全完成和完善,但让您了解使用 XSLT 2.0 进行这种处理),我在几分钟内就想出了这个:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="my:my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:variable name="vLines" select=
"tokenize(string(/*), '\s*&#xA;\s*')[.]"/>

<xsl:template match="/">
<xsl:sequence select="my:ProcessLines($vLines)"/>
<xsl:text>&#xA;</xsl:text>
</xsl:template>

<xsl:function name="my:ProcessLines" as="element()*">
<xsl:param name="pLines" as="xs:string*"/>

<xsl:for-each select="$pLines">
<xsl:sequence select="my:ProcessLine(.)"/>
</xsl:for-each>
</xsl:function>

<xsl:function name="my:ProcessLine" as="element()*">
<xsl:param name="pLine" as="xs:string*"/>

<xsl:variable name="vSides" select="tokenize($pLine, '=>')"/>

<xsl:variable name="vLHS" select="$vSides[1]"/>
<xsl:variable name="vRHS" select=
"substring($vSides[2],2, string-length($vSides[2])-2)"/>

<xsl:variable name="vGendElement" select=
"my:MakeElement(tokenize($vLHS, '_'))"/>

<xsl:sequence select="my:ImplantValues($vGendElement, $vRHS)"/>
</xsl:function>

<xsl:function name="my:MakeElement" >
<xsl:param name="pElemNames" as="xs:string*"/>

<xsl:if test="not(empty($pElemNames))">
<xsl:element name="{$pElemNames[1]}">
<xsl:sequence select=
"my:MakeElement($pElemNames[position() > 1])"/>
</xsl:element>
</xsl:if>
</xsl:function>

<xsl:function name="my:ImplantValues" as="element()*">
<xsl:param name="pTree" as="element()"/>
<xsl:param name="pValues" as="xs:string"/>

<xsl:variable name="vValues" select="tokenize($pValues, '\|')[.]"/>

<xsl:for-each select="$vValues[string-length(normalize-space()) > 0]">
<xsl:apply-templates select="$pTree">
<xsl:with-param name="pValue" select="."/>
</xsl:apply-templates>
</xsl:for-each>
</xsl:function>

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

<xsl:template match="*[not(*)]">
<xsl:param name="pValue"/>

<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:copy-of select="$pValue"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时 (它也可以简单地使用 unparsed-text() 函数从文件中读取输入):
<params>
userdata_token=>'abd'
userdata_time=>'12/09/2011'
user_message_address_city=>'Manchester|Harrow|'
user_message_address_postcode=>'M20 7LD||HA0 4BN'
user_message_address_addressee=>'|Pete|'
</params>

结果是 :
<userdata>
<token>abd</token>
</userdata>
<userdata>
<time>12/09/2011</time>
</userdata>
<user>
<message>
<address>
<city>Manchester</city>
</address>
</message>
</user>
<user>
<message>
<address>
<city>Harrow</city>
</address>
</message>
</user>
<user>
<message>
<address>
<postcode>M20 7LD</postcode>
</address>
</message>
</user>
<user>
<message>
<address>
<postcode>HA0 4BN</postcode>
</address>
</message>
</user>
<user>
<message>
<address>
<addressee>Pete</addressee>
</address>
</message>
</user>

要完成这个,只需要添加一些分组——我现在准备去上类,所以今天晚些时候可以完成。 :)

关于xml - 如何将纯文本转换为 xsl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7659293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com