我有一个大的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="'^([A-Z0-9]+)/Cell:eNodeB Function Name=[A-Z0-9]+, Local Cell ID=([0-9]+), Cell Name=.*/CnOperator:(CnOperatorId=[0-9]+)', '$1/CELL:$2/$3'"></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="'^\w+-\w+-\w+-\d+/Cell:eNodeB Function Name=([A-Z0-9]+), Local Cell ID=([0-9]+), Cell Name=.*, eNodeB ID=([0-9]+), Cell.*$', '$1/Cell:$2'"></Row>
<Row Key1="^\w+-\w+-\w+-\d+/EthernetInterface:Ethernet Interface No.=.*$" ElementType="EthernetInterface" RegexReplace="'^(\w+-\w+-\w+-\d+)/EthernetInterface:Ethernet Interface No.=([0-9]+)$' , '$1/No=$2'"></Row>
<Row Key1="^[A-Z0-9]+/CELL:Local cell identity=[0-9]+, Cell Name=.*/OPERATOR:CnOperatorId=[0-9]+$" ElementType="CELL_CORE_OPERATOR" RegexReplace="'^([A-Z0-9]+/CELL:)Local cell identity=([0-9]+), Cell Name=.*/OPERATOR:(CnOperatorId=[0-9]+)' , '$1$2/$3'"></Row>
<Row Key1="^[A-Z0-9]+/Cell:Local cell identity=[0-9]+, Cell Name=.*, eNodeB identity=[0-9]+$" ElementType="CELL" RegexReplace="'^([A-Z0-9]+/Cell:)Local cell identity=([0-9]+), Cell Name=.*, eNodeB identity=[0-9]+$', '$1$2'"></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="'^([A-Z0-9]+)/Cell:eNodeB Function Name=[A-Z0-9]+, Local Cell ID=([0-9]+), Cell Name=.*, eNodeB ID=([0-9]+)$', '$1/Cell:$2'"></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="'^([A-Z0-9]+)/Cell:eNodeB Function Name=[A-Z0-9]+, Local Cell ID=([0-9]+), Cell Name=.*, eNodeB ID=([0-9]+)$', '$1/Cell:$2'"></Row>
</Telsa>
我如何编码密钥查找?
<xsl:key name="table-lookup" match="Row" use="@Key1"/>
<xsl:variable name="LookupDoc" select="document('Telsa.xml')/Telsa"/>
答案 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)
我喜欢这个解决方案,唯一的另一个问题是这个逻辑可以像查找表一样放在外部文档中吗?