我正在尝试使用XSL文件转换以下XML部分。
XML文件示例:
<data>
<KEY name="B1F" value="Smith" />
<KEY name="B1L" value="Johnson" />
<KEY name="B2F" value="Nancy" />
<KEY name="B2L" value="Drew" />
<KEY name="B1Phone" value="123-456-7890" />
<KEY name="B1SSN" value="123-45-6789" />
<KEY name="B1Address" value="1234 Highway 102" />
<KEY name="B2Phone" value="123-456-7890" />
<KEY name="B2SSN" value="123-45-6789" />
<KEY name="B2Address" value="1234 Highway 102" />
<KEY name="B7SSN" value="987-65-4321" />
<KEY name="B8F" value="George" />
<KEY name="B8L" value="Lucas" />
</data>
当前的XSL摘录:
<xsl:variable name="ReplaceLiveDate" select="false()"/>
<xsl:variable name="BDOB" select="1990-01-01"/>
<xsl:variable name="BF">Test Borrower</xsl:variable>
<xsl:variable name="BL">Last Name</xsl:variable>
<xsl:variable name="BPhone" select="5551234567" />
<xsl:variable name="BSSN" select="555112345" />
<xsl:variable name="Address">Test Address</xsl:variable>
<!-- in DATA: output KEY sorted by @name -->
<xsl:template match="DATA">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates select="KEY">
<xsl:sort select="@name" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<!-- output KEY verbatim -->
<xsl:template match="KEY">
<xsl:copy-of select="." />
</xsl:template>
<!-- Start of the conversion for Live Data to Test
need to repeat or wildcard for each instance
<xsl:template match="KEY[@name='B1L']">
<xsl:copy>
<xsl:when test="$ReplaceLiveDate = false()">
<xsl:apply-templates select="node()|@*"/>
</xsl:when>
<xsl:otherwise>
<KEY value="$BL">
<xsl:apply-templates select="@*[not(name()='value')] | node()"/>
</KEY>
</xsl:otherwise>
</xsl:copy>
</xsl:template>-->
我希望能够使用通配符测试“name”的属性值,例如“B?L”或“B [1-8] L”,因为最多可以有8个实例,但我不确定如何将RegEx应用于所选语句 - 或者甚至可以这样做。
我想将@value
属性的值更新为在XSL顶部声明的变量的值(当前所有变量都已设置,但模板仅列出“B1L” “替代价值”。
代码的未注释部分可以正常工作,但注释部分无法正常工作。
预期结果:
<data>
<KEY name="B1F" value="Test Borrower" />
<KEY name="B1L" value="Last Name" />
<KEY name="B2F" value="Test Borrower" />
<KEY name="B2L" value="Last Name" />
<KEY name="B1Phone" value="5551234567" />
<KEY name="B1SSN" value="555112345" />
<KEY name="B1Address" value="Test Address" />
<KEY name="B2Phone" value="5551234567" />
<KEY name="B2SSN" value="555112345" />
<KEY name="B2Address" value="Test Address" />
<KEY name="B7SSN" value="555112345" />
<KEY name="B8F" value="Test Borrower" />
<KEY name="B8L" value="Last Name" />
</data>
提前感谢您对此事的帮助。
答案 0 :(得分:1)
以此为出发点?
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="@value">
<xsl:variable name="code" select="translate(../@name, '123456789', '000000000')" />
<xsl:attribute name="value">
<xsl:choose>
<xsl:when test="$code='B0F'">Test Borrower</xsl:when>
<xsl:when test="$code='B0L'">Last Name</xsl:when>
<!-- add more here -->
</xsl:choose>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>