使用正则表达式进行XSLT查找

时间:2016-08-26 22:32:11

标签: xslt-2.0

我有一个大的xsl:choose(即~100),其中xsl:when正在使用正则表达式进行测试。我正在寻找一种更清洁的方式,可以用查找表替换它吗?这只是我今天的代码示例

def myThing(k)

我很感谢帮助,如果我将它作为一个单独的XML文件并使用import或include,我认为我可以使Map示例代码工作。我只是想知道将它转换成文档查找是多么困难。我熟悉文档查找和键,但我不知道如何使用正则表达式编写查找代码?我有以下查找文档:

<xsl:when test="matches($seq4, '^\w+-\w+-\w+-\d+/NCell:.+$', 'i')"> 
<xsl:value-of select="'NEIGHBOR'"/>
</xsl:when>
<xsl:when   test="matches($seq4, '(/ULoCell:NodeB Function Name=.*, Local Cell ID=.*)', 'i')">
<xsl:value-of select="'SECTOR'"/>
</xsl:when>

我会用

定义查找
<Telsa xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <Row Key1="^[A-Z0-9]+/Cell:eNodeB Function Name=[A-Z0-9]+, Local Cell ID=[0-9]+, Cell Name=.*/CnOperator:CnOperatorId=[0-9]+$" ElementType="CELL_CORE_OPERATOR" RegexReplace="&apos;^([A-Z0-9]+)/Cell:eNodeB Function Name=[A-Z0-9]+, Local Cell ID=([0-9]+), Cell Name=.*/CnOperator:(CnOperatorId=[0-9]+)&apos;, &apos;$1/CELL:$2/$3&apos;"></Row>
  <Row Key1="^\w+-\w+-\w+-\d+/Cell:eNodeB Function Name=[A-Z0-9]+, Local Cell ID=[0-9]+, Cell Name=.*, eNodeB ID=[0-9]+, Cell.*$" ElementType="CELL" RegexReplace="&apos;^\w+-\w+-\w+-\d+/Cell:eNodeB Function Name=([A-Z0-9]+), Local Cell ID=([0-9]+), Cell Name=.*, eNodeB ID=([0-9]+), Cell.*$&apos;, &apos;$1/Cell:$2&apos;"></Row>
  <Row Key1="^\w+-\w+-\w+-\d+/EthernetInterface:Ethernet Interface No.=.*$" ElementType="EthernetInterface" RegexReplace="&apos;^(\w+-\w+-\w+-\d+)/EthernetInterface:Ethernet Interface No.=([0-9]+)$&apos; , &apos;$1/No=$2&apos;"></Row>
  <Row Key1="^[A-Z0-9]+/CELL:Local cell identity=[0-9]+, Cell Name=.*/OPERATOR:CnOperatorId=[0-9]+$" ElementType="CELL_CORE_OPERATOR" RegexReplace="&apos;^([A-Z0-9]+/CELL:)Local cell identity=([0-9]+), Cell Name=.*/OPERATOR:(CnOperatorId=[0-9]+)&apos; , &apos;$1$2/$3&apos;"></Row>
  <Row Key1="^[A-Z0-9]+/Cell:Local cell identity=[0-9]+, Cell Name=.*, eNodeB identity=[0-9]+$" ElementType="CELL" RegexReplace="&apos;^([A-Z0-9]+/Cell:)Local cell identity=([0-9]+), Cell Name=.*, eNodeB identity=[0-9]+$&apos;, &apos;$1$2&apos;"></Row>
  <Row Key1="^[A-Z0-9]+/Cell:eNodeB Function Name=[A-Z0-9]+, Local Cell ID=[0-9]+, Cell Name=.*, eNodeB ID=[0-9]+$" ElementType="CELL" RegexReplace="&apos;^([A-Z0-9]+)/Cell:eNodeB Function Name=[A-Z0-9]+, Local Cell ID=([0-9]+), Cell Name=.*, eNodeB ID=([0-9]+)$&apos;, &apos;$1/Cell:$2&apos;"></Row>
  <Row Key1="^[A-Z0-9]+/Cell:eNodeB Function Name=[A-Z0-9]+, Local Cell ID=[0-9]+, Cell Name=.*, eNodeB ID=[0-9]+$" ElementType="CELL" RegexReplace="&apos;^([A-Z0-9]+)/Cell:eNodeB Function Name=[A-Z0-9]+, Local Cell ID=([0-9]+), Cell Name=.*, eNodeB ID=([0-9]+)$&apos;, &apos;$1/Cell:$2&apos;"></Row>
</Telsa>

我如何编码密钥查找?

<xsl:key name="table-lookup" match="Row" use="@Key1"/>
<xsl:variable name="LookupDoc" select="document('Telsa.xml')/Telsa"/>

2 个答案:

答案 0 :(得分:1)

可能以下是您正在寻找的内容,它将正则表达式,标志和结果存储在XML结构中,然后查找第一个匹配元素:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:param name="pattern-map" as="element(map)*">
        <map pattern="^\w+-\w+-\w+-\d+/NCell:.+$" flags="i">NEIGHBOR</map>
        <map pattern="(/ULoCell:NodeB Function Name=.*, Local Cell ID=.*)" flags="i">SECTOR</map>
    </xsl:param>

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

    <xsl:template match="item">
        <xsl:copy>
            <xsl:value-of select="$pattern-map[matches(current(), @pattern, @flags)][1]"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

对战时
<root>
    <item>a-b-c-1/NCell:x</item>
    <item>/ULoCell:NodeB Function Name=x, Local Cell ID=.y</item>
</root>

输出

<root>
    <item>NEIGHBOR</item>
    <item>SECTOR</item>
</root>

如果正则表达式包含大括号{},请注意<map pattern="\w{2}" flags="i">foo</map>这样的文字结果元素,这会被解释为属性值模板,因此您需要加倍它们与<map pattern="\w{{2}}" flags="i">foo</map>中一样。

答案 1 :(得分:0)

我喜欢这个解决方案,唯一的另一个问题是这个逻辑可以像查找表一样放在外部文档中吗?