基于另一个属性的通配符匹配更新属性

时间:2017-02-09 18:20:10

标签: xml xslt

我正在尝试使用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>-->
  1. 我希望能够使用通配符测试“name”的属性值,例如“B?L”或“B [1-8] L”,因为最多可以有8个实例,但我不确定如何将RegEx应用于所选语句 - 或者甚至可以这样做。

  2. 我想将@value属性的值更新为在XSL顶部声明的变量的值(当前所有变量都已设置,但模板仅列出“B1L” “替代价值”。

  3. 代码的未注释部分可以正常工作,但注释部分无法正常工作。

    预期结果:

    <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>
    

    提前感谢您对此事的帮助。

1 个答案:

答案 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>